home *** CD-ROM | disk | FTP | other *** search
-
- /*-------------------------------------------------*/
- /* fireworks.c - graphical MIDI note visualisation */
- /* ® 1998 by Christian Buchner */
- /*-------------------------------------------------*/
-
- #define FPS 25 /* nominal frames per seconds */
- #define MIN_FPS 2 /* when FPS drops below, the */
- /* watchdog timer intervenes */
-
- #define NORMPRI -10 /* priority during normal operation */
- #define HIGHPRI 10 /* priority in idle mode or when */
- /* watchdog timer intervenes */
-
- #define MAXCOORD 1024
-
- #define CENTER_X 512 /* window width is 0...MAXCOORD */
- #define CENTER_Y 980 /* window height is 0...MAXCOORD */
-
-
-
- /* Library bases */
-
- struct ExecBase *SysBase;
- struct DosLibrary *DOSBase;
- struct GfxBase *GfxBase;
- struct Library *LayersBase;
- struct IntuitionBase *IntuitionBase;
- struct Library *GadToolsBase;
- struct Library *UtilityBase;
- struct Library *DatatypesBase;
- struct Library *AslBase;
- struct Library *WorkbenchBase;
- struct Library *CamdBase;
- struct Library *TimerBase;
- BOOL FPBase; /* pseudo floating point base */
-
-
- /* Workbench or not? */
-
- BOOL WBMode = FALSE;
-
-
- /* this task */
-
- struct Task *MyTask;
-
-
- /* these flags serve for keeping track of asynchronous tasks */
-
- typedef enum
- {
- AboutTask = 0x00000001, /* these are the asynchronous messages */
- SaveTask = 0x00000002,
- ErrTask = 0x00000004,
- DropTask = 0x00000008,
- LaunchTask = 0x00000010,
- CloseTask = 0x00000020,
-
- PlayTask = 0x00000100, /* these are the file requesters */
- ImageTask = 0x00000200,
-
- ScreenTask = 0x00001000, /* the screenmode requester */
-
- } TaskFlag;
-
-
- /* Function Prototypes */
-
- LONG ShellInterface(void);
- LONG WBInterface(struct Process *MyProc);
-
- BOOL WindowLayout(struct Globals *glob, WORD *minw, WORD *minh, WORD *maxw, WORD *maxh);
-
- LONG Fireworks(struct Prefs *pref);
- void MainLoop(struct Globals *glob, struct Prefs *pref);
-
- APTR Lin_InitFireworks(struct Globals *glob, struct Prefs *pref);
- void Lin_RethinkWindow(APTR data);
- void Lin_TimePassed(APTR data);
- BOOL Lin_IsIdle(APTR data);
- void Lin_DrawFireworks(APTR data, UWORD Mask);
- void Lin_NoteOn(APTR data, UBYTE chn, UBYTE note, UBYTE vel);
- void Lin_NoteOff(APTR data, UBYTE chn, UBYTE note);
- void Lin_ReleaseNotes(APTR data);
- void Lin_FreeNoteData(APTR data);
- void Lin_ExitFireworks(APTR data);
-
- APTR Par_InitFireworks(struct Globals *glob, struct Prefs *pref);
- void Par_RethinkWindow(APTR data);
- void Par_TimePassed(APTR data);
- BOOL Par_IsIdle(APTR data);
- void Par_DrawFireworks(APTR data, UWORD Mask);
- void Par_NoteOn(APTR data, UBYTE chn, UBYTE note, UBYTE vel);
- void Par_NoteOff(APTR data, UBYTE chn, UBYTE note);
- void Par_ReleaseNotes(APTR data);
- void Par_FreeNoteData(APTR data);
- void Par_ExitFireworks(APTR data);
-
- void Par_DrawFireworks2(APTR data, UWORD Mask);
-
- BOOL OpenGUI(struct Globals *glob, struct Prefs *pref);
- void TitleWindow(struct Globals *glob, UBYTE *Text, ...);
- BOOL SelectScreenMode(struct Globals *glob, struct Prefs *pref, struct ScreenModeRequester **srq);
- void CloseGUI(struct Globals *glob, struct Prefs *pref);
-
- void InitPrefs(struct Prefs *pref);
- void InitGlobals(struct Globals *glob);
-
- int __interrupt __saveds VBlankInterface( void );
-
- void AsyncSelectScreenMode(struct Globals *glob, struct Prefs *pref);
- void AsyncSelectImage(struct Globals *glob, struct Prefs *pref);
- void AsyncSelectAndPlay(struct Globals *glob, struct Prefs *pref);
-
- BOOL InitOrUpdateGraphics(struct Globals *glob, struct Prefs *pref);
- void FreeGraphics(struct Globals *glob);
- struct Screen *GetScreen(struct Globals *glob);
-
- void LoadImage(struct Globals *glob, struct Prefs *pref);
- BOOL SelectImage(struct Globals *glob, struct FileRequester **fr, UBYTE *filebuffer, ULONG MaxSize);
-
- BOOL SelectMIDI(struct Globals *glob, struct FileRequester **fr, UBYTE *filebuffer, ULONG MaxSize);
- void PlayMIDI(struct Globals *glob, struct Prefs *pref);
- void StopMIDI(struct Globals *glob, struct Prefs *pref);
-
- BOOL OpenLibs(void);
- void CloseLibs(void);
-
- struct timerequest *OpenTimer(void);
- void CloseTimer(struct timerequest *treq);
- ULONG GetTimeDelta(void);
-
- BOOL AllocAsync(struct Globals *glob, TaskFlag flg);
- void FreeAsync(struct Globals *glob, TaskFlag flg);
- BOOL AskAsync(struct Globals *glob);
- void WaitAsync(struct Globals *glob);
-
- LONG __stdargs Message(UBYTE *Msg,UBYTE *Options,...);
- LONG MessageA(UBYTE *Msg,UBYTE *Options,APTR Args);
- LONG __stdargs AsyncMessage(struct Globals *glob, TaskFlag flg, UBYTE *Msg,UBYTE *Options,...);
- void __stdargs _XCEXIT(LONG lcode);
-
- extern BOOL __stdargs __fpinit(void);
- extern void __stdargs __fpterm(void);
-
- /* SPrintf.a */
- APTR __stdargs SPrintf(char *, const char *, ...);
- APTR __stdargs VSPrintf(char *, const char *, va_list);
-
-
- /* CAM Library data and protos */
-
- struct MidiNode *CreateMidi(Tag tag, ...);
- BOOL SetMidiAttrs(struct MidiNode *mi, Tag tag, ...);
- struct MidiLink *AddMidiLink(struct MidiNode *mi, LONG type, Tag tag, ...);
- BOOL SetMidiLinkAttrs(struct MidiLink *mi, Tag tag, ...);
-
-
-
- /* Intuition data structures */
-
- enum
- {
- Backgroundpen = 0,
- Channelpens = 1,
-
- NUMPENS = Channelpens + 16
- };
-
-
- ULONG ScreenPalette[] =
- {
- ((2L<<16) | 0),
-
- 0x00000000, 0x00000000, 0x00000000,
- 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA,
-
- ((0L<<16) | 0)
- };
-
-
- UWORD PenArray[] =
- {
- 1, // DETAILPEN
- 0, // BLOCKPEN
- 1, // TEXTPEN
- 1, // SHINEPEN
- 1, // SHADOWPEN
- 1, // FILLPEN
- 0, // FILLTEXTPEN
- 0, // BACKGROUNDPEN
- 1, // HIGHLIGHTTEXTPEN
- 1, // BARDETAILPEN
- 0, // BARBLOCKPEN
- 0, // BARTRIMPEN
- };
-
-
- UBYTE PenColors[NUMPENS][3] =
- {
- 0x00, 0x00, 0x00, /* Black background */
-
- 255, 64, 64, /* Chan 1 */
- 255, 137, 64, /* Chan 2 */
- 255, 207, 64, /* Chan 3 */
- 230, 255, 64, /* Chan 4 */
- 159, 255, 64, /* Chan 5 */
- 86, 255, 64, /* Chan 6 */
- 64, 255, 112, /* Chan 7 */
- 64, 255, 185, /* Chan 8 */
- 64, 255, 255, /* Chan 9 */
- 64, 185, 255, /* Chan 10 */
- 64, 112, 255, /* Chan 11 */
- 86, 64, 255, /* Chan 12 */
- 159, 64, 255, /* Chan 13 */
- 230, 64, 255, /* Chan 14 */
- 255, 64, 207, /* Chan 15 */
- 255, 64, 137, /* Chan 16 */
- };
-
-
- static UWORD chip WaitPointer[] =
- {
- 0x0000, 0x0000,
-
- 0x0400, 0x07C0,
- 0x0000, 0x07C0,
- 0x0100, 0x0380,
- 0x0000, 0x07E0,
- 0x07C0, 0x1FF8,
- 0x1FF0, 0x3FEC,
- 0x3FF8, 0x7FDE,
- 0x3FF8, 0x7FBE,
- 0x7FFC, 0xFF7F,
- 0x7EFC, 0xFFFF,
- 0x7FFC, 0xFFFF,
- 0x3FF8, 0x7FFE,
- 0x3FF8, 0x7FFE,
- 0x1FF0, 0x3FFC,
- 0x07C0, 0x1FF8,
- 0x0000, 0x07E0,
-
- 0x0000, 0x0000, /* reserved, must be NULL */
- };
-
-
- /* global preferences data */
-
- struct Prefs
- {
- ULONG Flags;
- UWORD WinX;
- UWORD WinY;
- UWORD WinW;
- UWORD WinH;
- UBYTE *Image;
- UBYTE NewImage[240];
- UBYTE *Link;
- UBYTE NewLink[32];
- ULONG ScreenMode;
- UWORD ScreenWidth;
- UWORD ScreenHeight;
- UWORD ScreenDepth;
- ULONG OverscanType;
- BOOL AutoScroll;
- UBYTE MIDIFile[240];
- UWORD FWMode;
- };
-
- #define PREFF_DOUBLE 1
- #define PREFF_TILE 2
- #define PREFF_FULLSCREEN 4
- #define PREFF_BACKDROP 8
-
-
- /* The fireworks modes */
-
- enum
- {
- LinearMode,
- ParabolicMode,
- ParabolicMode2,
- NUM_FWMODES,
- };
-
- struct FWDefinition
- {
- APTR (*InitFireworks)(struct Globals *glob, struct Prefs *pref);
- void (*RethinkWindow)(APTR data);
- void (*TimePassed)(APTR data);
- BOOL (*IsIdle)(APTR data);
- void (*DrawFireworks)(APTR data, UWORD Mask);
- void (*NoteOn)(APTR data, UBYTE chn, UBYTE note, UBYTE vel);
- void (*NoteOff)(APTR data, UBYTE chn, UBYTE note);
- void (*ReleaseNotes)(APTR data);
- void (*FreeNoteData)(APTR data);
- void (*ExitFireworks)(APTR data);
- } FWDefinitions[NUM_FWMODES] =
- {
- &Lin_InitFireworks,
- &Lin_RethinkWindow,
- &Lin_TimePassed,
- &Lin_IsIdle,
- &Lin_DrawFireworks,
- &Lin_NoteOn,
- &Lin_NoteOff,
- &Lin_ReleaseNotes,
- &Lin_FreeNoteData,
- &Lin_ExitFireworks,
-
- &Par_InitFireworks,
- &Par_RethinkWindow,
- &Par_TimePassed,
- &Par_IsIdle,
- &Par_DrawFireworks,
- &Par_NoteOn,
- &Par_NoteOff,
- &Par_ReleaseNotes,
- &Par_FreeNoteData,
- &Par_ExitFireworks,
-
- &Par_InitFireworks,
- &Par_RethinkWindow,
- &Par_TimePassed,
- &Par_IsIdle,
- &Par_DrawFireworks2,
- &Par_NoteOn,
- &Par_NoteOff,
- &Par_ReleaseNotes,
- &Par_FreeNoteData,
- &Par_ExitFireworks,
- };
-
-
- /* all data structures and pointers needed by this program */
-
- struct Globals
- {
- struct Screen *LockedScreen;
- struct Screen *OpenedScreen;
-
- struct Screen *Screen;
- APTR VisualInfo;
- struct Window *Window;
- struct Menu *Menu;
-
- struct Window *ProcWindow;
-
- struct AppWindow *AppWindow;
-
- struct timerequest *treq;
-
- WORD ww, wh;
-
- LONG PenArray[NUMPENS];
-
- Object *dto;
- struct BitMap *BGBitMap;
- struct BitMap *PaintBitMap;
- struct RastPort PaintRP;
- struct Layer_Info *LInfo;
- struct Layer *PaintLayer;
-
- struct MidiNode *midi;
- struct MidiLink *link;
-
- UBYTE WTitle[80];
-
- APTR NotePool;
-
- BOOL GUIRefresh;
-
- struct FileRequester *ImageFR;
- struct FileRequester *MIDIFR;
- struct ScreenModeRequester *ScreenModeRQ;
-
- ULONG TaskAlloc;
- };
-
-
- /* Some defines */
-
- /* the opposite of noteon() */
- #define noteoff(m) ( voicemsg(m,MS_NoteOff) || (voicemsg(m,MS_NoteOn) && (!(m)->mm_Data2)) )
-
- #define offsetof(s, m) (size_t)(&(((s *)0)->m))
- #define MIN(a,b) ((a) <= (b) ? (a) : (b))
- #define elementsof(a) ((sizeof(a) / sizeof(a[0])))
-
-
- /* Intuition structures */
-
- enum
- {
- Menu_Ignore1,
- Menu_Link,
- Menu_Save,
- Menu_Ignore2,
- Menu_About,
- Menu_Ignore3,
- Menu_Quit,
- Menu_Ignore4,
- Menu_Kill,
- Menu_Load,
- Menu_Tile,
- Menu_Ignore5,
- Menu_Screenmode,
- Menu_Fullscreen,
- Menu_Ignore6,
- Menu_Mode1,
- Menu_Mode2,
- Menu_Mode3,
- Menu_Ignore7,
- Menu_Double,
- Menu_Ignore8,
- Menu_Release,
- Menu_Ignore9,
- Menu_Play,
- Menu_Stop,
- Menu_Ignore10,
- };
-
-
- struct NewMenu FWNewMenu[]=
- {
- /* nm_Type nm_Label nm_CommKey nm_Flags nm_MutualExclude nm_UserData */
- NM_TITLE, "Project", NULL, 0, 0, (APTR)Menu_Ignore1,
- NM_ITEM, "MIDI Link...", "L", 0, 0, (APTR)Menu_Link,
- NM_ITEM, "Save Config", "C", 0, 0, (APTR)Menu_Save,
- NM_ITEM, NM_BARLABEL, NULL, 0, 0, (APTR)Menu_Ignore2,
- NM_ITEM, "About", "?", 0, 0, (APTR)Menu_About,
- NM_ITEM, NM_BARLABEL, NULL, 0, 0, (APTR)Menu_Ignore3,
- NM_ITEM, "Quit", "Q", 0, 0, (APTR)Menu_Quit,
- NM_TITLE, "Window", NULL, 0, 0, (APTR)Menu_Ignore4,
- NM_ITEM, "Remove Backdrop", "R", 0, 0, (APTR)Menu_Kill,
- NM_ITEM, "Load Backdrop...", "B", 0, 0, (APTR)Menu_Load,
- NM_ITEM, "Tile Backdrop", "T", CHECKIT|MENUTOGGLE, 0, (APTR)Menu_Tile,
- NM_ITEM, NM_BARLABEL, NULL, 0, 0, (APTR)Menu_Ignore5,
- NM_ITEM, "Set Screenmode...","M", 0, 0, (APTR)Menu_Screenmode,
- NM_ITEM, "Full Screen", "F", CHECKIT|MENUTOGGLE, 0, (APTR)Menu_Fullscreen,
- NM_TITLE, "Rendering", NULL, 0, 0, (APTR)Menu_Ignore6,
- NM_ITEM, "Laser Mode", "1", CHECKIT, ( 2|4), (APTR)Menu_Mode1,
- NM_ITEM, "Pixel Mode", "2", CHECKIT, (1| 4), (APTR)Menu_Mode2,
- NM_ITEM, "Fountain Mode", "3", CHECKIT, (1|2 ), (APTR)Menu_Mode3,
- NM_ITEM, NM_BARLABEL, NULL, 0, 0, (APTR)Menu_Ignore7,
- NM_ITEM, "Double Strength", "D", CHECKIT|MENUTOGGLE, 0, (APTR)Menu_Double,
- NM_TITLE, "MIDI", NULL, 0, 0, (APTR)Menu_Ignore8,
- NM_ITEM, "Release Notes", "N", 0, 0, (APTR)Menu_Release,
- NM_ITEM, NM_BARLABEL, NULL, 0, 0, (APTR)Menu_Ignore9,
- NM_ITEM, "Play MIDI file...","P", 0, 0, (APTR)Menu_Play,
- NM_ITEM, "Stop playing", "S", 0, 0, (APTR)Menu_Stop,
- NM_END, NULL, NULL, 0, 0, (APTR)Menu_Ignore10,
- };
-
-
- /* Interrupt stuff */
-
- struct Interrupt VertBlank =
- {
- NULL,NULL,NT_INTERRUPT,-60,"Fireworks VBlank", /* node, pri = -60 */
- NULL, /* data ptr, same as inputevent */
- (void *)VBlankInterface /* code ptr */
- };
-
- BOOL Watch = FALSE;
- ULONG IdleCount = 0;
-
-
- /*--------------*/
- /* Startup code */
- /*--------------*/
-
- LONG __saveds mymain(void)
- {
- LONG ReturnCode;
-
- struct Process *MyProc;
-
- SysBase = *((struct ExecBase**)(0x4));
-
- MyProc = (struct Process*) FindTask(NULL);
-
- if (!MyProc->pr_CLI)
- {
- WBMode = TRUE;
- ReturnCode = WBInterface(MyProc);
- }
- else
- {
- ReturnCode = ShellInterface();
- }
-
- return(ReturnCode);
- }
-
-
-
- /*---------------------*/
- /* Workbench Interface */
- /*---------------------*/
-
- LONG WBInterface(struct Process *MyProc)
- {
- struct WBStartup *wbmsg;
-
- LONG ReturnCode;
-
- WaitPort(&MyProc->pr_MsgPort);
-
- if (wbmsg = (struct WBStartup*)GetMsg(&MyProc->pr_MsgPort))
- {
- if (OpenLibs())
- {
- BPTR OldDir;
- struct Prefs *pref;
-
- OldDir = CurrentDir(wbmsg->sm_ArgList->wa_Lock);
-
- if (!(pref = AllocVec(sizeof(struct Prefs),MEMF_ANY|MEMF_CLEAR)))
- {
- Message("No memory for prefs!",NULL);
- }
- else
- {
- InitPrefs(pref);
-
- ReturnCode = Fireworks(pref);
-
- FreeVec(pref);
- }
-
- CurrentDir(OldDir);
-
- CloseLibs();
- }
- Forbid();
- ReplyMsg((struct Message*)wbmsg);
- }
- return(ReturnCode);
- }
-
-
-
- /*-----------------*/
- /* Shell Interface */
- /*-----------------*/
-
- LONG ShellInterface(void)
- {
- LONG ReturnCode = RETURN_ERROR;
- BPTR lock;
- BPTR OldDir;
-
- if (OpenLibs())
- {
- if (!(lock = Lock("PROGDIR:", SHARED_LOCK)))
- {
- Message("Unable to locate program directory.",NULL);
- }
- else
- {
- /* CLI argument parsing */
-
- struct ArgArray
- {
- UBYTE *aa_Link;
- ULONG *aa_Mode;
- ULONG *aa_WinX;
- ULONG *aa_WinY;
- ULONG *aa_WinW;
- ULONG *aa_WinH;
- UBYTE *aa_Image;
- ULONG aa_Tile;
- ULONG aa_Double;
- ULONG aa_Fullscreen;
- } AA = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, FALSE, FALSE, FALSE};
-
- static UBYTE *Template = "LINK/K,MODE/K/N,WINX/K/N,WINY/K/N,WINW/K/N,WINH/K/N,IMAGE/K,TILE/S,DOUBLE/S,FULLSCREEN/S";
- struct RDArgs *RDArgs;
-
- struct Prefs *pref;
-
- ReturnCode = RETURN_FAIL;
-
- OldDir = CurrentDir(lock);
-
- if (!(pref = AllocVec(sizeof(struct Prefs),MEMF_ANY|MEMF_CLEAR)))
- {
- Message("No memory for prefs!",NULL);
- }
- else
- {
- InitPrefs(pref);
-
- if (RDArgs=ReadArgs(Template, (LONG *)&AA, 0))
- {
- if (AA.aa_Link) pref->Link = AA.aa_Link;
- if (AA.aa_Mode)
- {
- LONG mode = (*AA.aa_Mode) - 1;
- if (mode >=0 && mode < NUM_FWMODES) pref->FWMode = mode;
- else
- Message("Mode out of range! There are currently modes 1-%ld available.", NULL, NUM_FWMODES);
- }
- if (AA.aa_WinX) pref->WinX= *AA.aa_WinX;
- if (AA.aa_WinY) pref->WinY= *AA.aa_WinY;
- if (AA.aa_WinW) pref->WinW= *AA.aa_WinW;
- if (AA.aa_WinH) pref->WinH= *AA.aa_WinH;
- if (AA.aa_Image) pref->Image=AA.aa_Image;
- if (AA.aa_Tile) pref->Flags |= PREFF_TILE;
- if (AA.aa_Double) pref->Flags |= PREFF_DOUBLE;
- if (AA.aa_Fullscreen) pref->Flags |= PREFF_FULLSCREEN;
-
- ReturnCode = Fireworks(pref);
-
- FreeArgs(RDArgs);
- }
- else
- {
- PrintFault(IoErr(),"vu");
- }
-
- FreeVec(pref);
- }
-
- CurrentDir(OldDir);
-
- UnLock(lock);
- }
- CloseLibs();
- }
- return(ReturnCode);
- }
-
-
-
- /*-----------------------------*/
- /* GUI and MIDI initialisation */
- /*-----------------------------*/
-
- LONG Fireworks(struct Prefs *pref)
- {
- LONG ReturnCode = RETURN_FAIL;
-
- struct Globals *glob;
-
- BYTE OldPri;
-
- MyTask = FindTask(NULL);
-
- if (!(glob = AllocVec(sizeof(struct Globals), MEMF_ANY|MEMF_CLEAR)))
- {
- Message("No memory for globals!",NULL);
- }
- else
- {
- InitGlobals(glob);
-
- if (OpenGUI(glob,pref))
- {
- if (!((glob->NotePool = CreatePool(MEMF_ANY,8192,4096))))
- {
- Message("No memory for NotePool!",NULL);
- }
- else
- {
- if (!(glob->midi = CreateMidi(
- MIDI_Name, "VU Meters",
- MIDI_RecvSignal, SIGBREAKB_CTRL_E,
- MIDI_MsgQueue, 2000,
- MIDI_ErrFilter, CMEF_All,
- TAG_DONE)))
- {
- Message("Cannot create MIDI port!",NULL);
- }
- else
- {
- if (!(glob->link = AddMidiLink(glob->midi, MLTYPE_Receiver,
- MLINK_Name, "VU Meter Link",
- MLINK_Location, pref->Link,
- MLINK_EventMask, CMF_Note|CMF_Mode,
- MLINK_Comment, "Fireworks [Input]",
- TAG_DONE)))
- {
- Message("Cannot create link to MIDI interface '%s'",NULL,pref->Link);
- }
- else
- {
- TitleWindow(glob, "Fireworks [%s] [idle]", pref->Link);
-
- if (!(glob->treq = OpenTimer()))
- {
-
- }
- else
- {
- OldPri = MyTask->tc_Node.ln_Pri;
-
- MainLoop(glob, pref);
-
- WaitAsync(glob);
-
- ReturnCode = RETURN_OK;
-
- SetTaskPri(MyTask, OldPri);
-
- CloseTimer(glob->treq);
- glob->treq=NULL;
- }
- RemoveMidiLink(glob->link);
- glob->link = NULL;
- }
- DeleteMidi(glob->midi);
- glob->midi = NULL;
- }
- DeletePool(glob->NotePool);
- glob->NotePool = NULL;
- }
- CloseGUI(glob, pref);
- }
-
- if (glob->ImageFR)
- {
- FreeAslRequest(glob->ImageFR);
- glob->ImageFR = NULL;
- }
-
- if (glob->MIDIFR)
- {
- FreeAslRequest(glob->MIDIFR);
- glob->MIDIFR = NULL;
- }
-
- if (glob->ScreenModeRQ)
- {
- FreeAslRequest(glob->ScreenModeRQ);
- glob->ScreenModeRQ = NULL;
- }
-
- FreeVec(glob);
- }
- return(ReturnCode);
- }
-
-
- /*--------------------*/
- /* Set Prefs defaults */
- /*--------------------*/
-
- void InitPrefs(struct Prefs *pref)
- {
- pref->Link = "out.0";
- pref->WinX = 100;
- pref->WinY = 200;
- pref->WinW = 256;
- pref->WinH = 256;
- pref->Flags = PREFF_BACKDROP;
- pref->Image = "PROGDIR:Backdrop.Pic";
- pref->ScreenMode = -1L;
- pref->ScreenWidth = 0;
- pref->ScreenHeight = 0;
- pref->ScreenDepth = 0;
- pref->OverscanType = 0;
- pref->AutoScroll = FALSE;
- pref->FWMode = ParabolicMode2;
- }
-
-
- /*--------------------*/
- /* Initialize globals */
- /*--------------------*/
-
- void InitGlobals(struct Globals *glob)
- {
- UWORD i;
-
- for (i=0; i<NUMPENS; i++) glob->PenArray[i] = -1L;
- }
-
-
- /*-------------------------------*/
- /* Open the GUI (Screen, Window) */
- /*-------------------------------*/
-
- BOOL OpenGUI(struct Globals *glob, struct Prefs *pref)
- {
- BOOL Success = FALSE;
-
- struct Screen *wbscr;
-
- WORD minw, minh;
- WORD maxw, maxh;
-
- UWORD mode;
-
- glob->Screen = NULL;
-
- if (pref->Flags & PREFF_FULLSCREEN)
- {
- if (pref->ScreenMode == -1L)
- {
- if (!SelectScreenMode(glob, pref, &glob->ScreenModeRQ))
- {
- pref->Flags &= ~(PREFF_FULLSCREEN);
- }
- }
- }
-
- if (pref->Flags & PREFF_FULLSCREEN)
- {
- if (pref->ScreenMode != -1L)
- {
- struct Screen *scr = NULL;
-
- /* maybe screen couldn't be closed before (visitor window) */
- if (glob->OpenedScreen) CloseScreen(glob->OpenedScreen);
-
- if (!(scr = OpenScreenTags(NULL,
- SA_DisplayID, pref->ScreenMode,
- SA_Width, (ULONG)pref->ScreenWidth,
- SA_Height, (ULONG)pref->ScreenHeight,
- SA_Depth, (ULONG)pref->ScreenDepth,
- SA_Overscan, (ULONG)pref->OverscanType,
- SA_AutoScroll, (ULONG)pref->AutoScroll,
- SA_SharePens, (ULONG)TRUE,
- SA_Interleaved, (ULONG)TRUE,
- SA_PubName, "Fireworks",
- SA_Colors32, ScreenPalette,
- SA_Pens, PenArray,
- TAG_DONE )))
- {
- Message("Unable to open selected screen!",NULL);
- }
- else
- {
- glob->Screen = glob->OpenedScreen = scr;
-
- if (glob->LockedScreen)
- {
- UnlockPubScreen(NULL, glob->LockedScreen);
- glob->LockedScreen = NULL;
- }
- }
- }
- }
- else
- {
- if (!glob->LockedScreen)
- {
- glob->LockedScreen = GetScreen(glob);
- }
- glob->Screen = glob->LockedScreen;
- }
-
- if (glob->Screen)
- {
- if (!(glob->VisualInfo = GetVisualInfo(glob->Screen, TAG_DONE)))
- {
- Message("No visual info!",NULL);
- }
- else
- {
- glob->ww = pref->WinW;
- glob->wh = pref->WinH;
-
- if (!(WindowLayout(glob, &minw, &minh, &maxw, &maxh )))
- {
- Message("Couldn't layout window!",NULL);
- }
- else
- {
- if (pref->Flags & PREFF_FULLSCREEN)
- {
- glob->Window = OpenWindowTags( NULL,
- WA_PubScreen, glob->Screen,
- WA_Left, 0,
- WA_Top, glob->Screen->BarHeight+1,
- WA_Width, pref->ScreenWidth,
- WA_Height, pref->ScreenHeight-(glob->Screen->BarHeight+1),
- WA_Backdrop, TRUE,
- WA_Borderless, TRUE,
- WA_Activate, TRUE,
- WA_IDCMP, IDCMP_MENUPICK|IDCMP_REFRESHWINDOW,
- WA_SimpleRefresh, TRUE,
- WA_NewLookMenus, TRUE,
- TAG_DONE );
- }
- else
- {
- glob->Window = OpenWindowTags( NULL,
- WA_PubScreen, glob->Screen,
- WA_Title, "Fireworks",
- WA_Left, pref->WinX,
- WA_Top, pref->WinY,
- WA_InnerWidth, (ULONG)glob->ww,
- WA_InnerHeight, (ULONG)glob->wh,
- WA_GimmeZeroZero, TRUE,
- WA_DepthGadget, TRUE,
- WA_SizeGadget, TRUE,
- WA_SizeBBottom, TRUE,
- WA_CloseGadget, TRUE,
- WA_DragBar, TRUE,
- WA_Activate, TRUE,
- WA_IDCMP, IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE|IDCMP_MENUPICK|IDCMP_REFRESHWINDOW,
- WA_SimpleRefresh, TRUE,
- WA_NewLookMenus, TRUE,
- TAG_DONE );
- }
-
- if (!glob->Window)
- {
- Message("Couldn't open window!",NULL);
- }
- else
- {
- glob->ProcWindow = ((struct Process*)MyTask)->pr_WindowPtr;
- ((struct Process*)MyTask)->pr_WindowPtr = glob->Window;
-
- if ( wbscr = LockPubScreen("Workbench") )
- {
- if (glob->Screen == wbscr)
- {
- glob->AppWindow = AddAppWindow( 1, NULL, glob->Window, &((struct Process*)MyTask)->pr_MsgPort, TAG_DONE);
- }
-
- UnlockPubScreen( NULL, wbscr );
- }
-
- glob->ww = glob->Window->Width - glob->Window->BorderLeft-glob->Window->BorderRight ;
- glob->wh = glob->Window->Height - glob->Window->BorderTop -glob->Window->BorderBottom;
-
- glob->Window->MinWidth = minw + glob->Window->BorderLeft+glob->Window->BorderRight;
- glob->Window->MinHeight = minh + glob->Window->BorderTop +glob->Window->BorderBottom;
- glob->Window->MaxWidth = maxw + glob->Window->BorderLeft+glob->Window->BorderRight;
- glob->Window->MaxHeight = maxh + glob->Window->BorderTop +glob->Window->BorderBottom;
-
- if (!(InitOrUpdateGraphics(glob,pref)))
- {
- Message("Failed to initialize graphics!",NULL);
- }
- else
- {
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
-
- if (pref->Flags & PREFF_BACKDROP)
- if (pref->Image) LoadImage(glob,pref);
-
- if (pref->Flags & PREFF_DOUBLE)
- FWNewMenu[Menu_Double].nm_Flags |= CHECKED;
- else
- FWNewMenu[Menu_Double].nm_Flags &= (~CHECKED);
-
- if (pref->Flags & PREFF_TILE)
- FWNewMenu[Menu_Tile].nm_Flags |= CHECKED;
- else
- FWNewMenu[Menu_Tile].nm_Flags &= (~CHECKED);
-
- if (pref->Flags & PREFF_FULLSCREEN)
- FWNewMenu[Menu_Fullscreen].nm_Flags |= CHECKED;
- else
- FWNewMenu[Menu_Fullscreen].nm_Flags &= (~CHECKED);
-
- for (mode = 0; mode < NUM_FWMODES ; mode++)
- {
- if (pref->FWMode == mode)
- FWNewMenu[Menu_Mode1+mode].nm_Flags |= CHECKED;
- else
- FWNewMenu[Menu_Mode1+mode].nm_Flags &= (~CHECKED);
- }
-
- if (!(glob->Menu=(struct Menu *)CreateMenus(FWNewMenu, TAG_DONE)))
- {
- Message("Failed to create intuition menu.",NULL);
- }
- else
- {
- LayoutMenus(glob->Menu, glob->VisualInfo, GTMN_NewLookMenus, TRUE, TAG_DONE);
- SetMenuStrip(glob->Window, glob->Menu);
-
- Success = TRUE;
- }
- }
- }
- }
- }
- }
-
- if (!Success) CloseGUI(glob, pref);
-
- return(Success);
- }
-
-
- /*----------------------*/
- /* Set the window title */
- /*----------------------*/
-
- void TitleWindow(struct Globals *glob, UBYTE *Text, ...)
- {
- va_list Arg;
- va_start(Arg,Text);
-
- VSPrintf(glob->WTitle, Text, Arg);
-
- if (glob->OpenedScreen)
- {
- SetWindowTitles(glob->Window, (UBYTE*) ~0, glob->WTitle);
- }
- else
- {
- SetWindowTitles(glob->Window, glob->WTitle, (UBYTE*) ~0);
- }
-
- va_end(Arg);
- }
-
-
- /*---------------------------*/
- /* Choose desired screenmode */
- /*---------------------------*/
-
- BOOL SelectScreenMode(struct Globals *glob, struct Prefs *pref, struct ScreenModeRequester **srq)
- {
- BOOL Result = FALSE;
-
- ULONG InitialDisplayID = pref->ScreenMode;
- UWORD InitialDisplayDepth = pref->ScreenDepth;
- UWORD InitialDisplayWidth = pref->ScreenWidth;
- UWORD InitialDisplayHeight = pref->ScreenHeight;
- ULONG InitialOverscanType = pref->OverscanType;
- BOOL InitialAutoScroll = pref->AutoScroll;
-
- if (InitialDisplayID == -1L)
- {
- struct DimensionInfo dims;
-
- if ((InitialDisplayID = BestModeID(
- BIDTAG_NominalWidth, 320,
- BIDTAG_NominalHeight, 240,
- BIDTAG_Depth, 8,
- TAG_DONE )) == INVALID_ID)
- {
- InitialDisplayID = LORES_KEY;
- }
-
- InitialOverscanType = OSCAN_TEXT;
- InitialAutoScroll = TRUE;
-
- if (GetDisplayInfoData(NULL, (UBYTE*)&dims, sizeof(dims), DTAG_DIMS, InitialDisplayID) < sizeof(dims))
- {
- InitialDisplayDepth = 8;
- InitialDisplayWidth = 320;
- InitialDisplayHeight = 240;
- }
- else
- {
- InitialDisplayDepth = dims.MaxDepth;
- InitialDisplayWidth = (dims.TxtOScan.MaxX-dims.TxtOScan.MinX) + 1;
- InitialDisplayHeight = (dims.TxtOScan.MaxY-dims.TxtOScan.MinY) + 1;
- }
- }
-
- if (!(*srq))
- {
- if (!((*srq) = AllocAslRequestTags(ASL_ScreenModeRequest,
- ASLSM_TitleText, "Select screen mode",
- TAG_DONE)))
- {
- Message("Unable to allocate ASL screenmode requester.",NULL);
- }
- }
-
- if (*srq)
- {
- Result = AslRequestTags(*srq,
- ASLSM_Screen, GetScreen(glob),
- ASLSM_DoWidth, TRUE,
- ASLSM_DoHeight, TRUE,
- ASLSM_DoDepth, TRUE,
- ASLSM_DoOverscanType, TRUE,
- ASLSM_DoAutoScroll, TRUE,
- ASLSM_InitialDisplayID, InitialDisplayID,
- ASLSM_InitialDisplayWidth, InitialDisplayWidth,
- ASLSM_InitialDisplayHeight, InitialDisplayHeight,
- ASLSM_InitialDisplayDepth, InitialDisplayDepth,
- ASLSM_InitialOverscanType, InitialOverscanType,
- ASLSM_InitialAutoScroll, InitialAutoScroll,
- TAG_DONE);
-
- if (Result)
- {
- pref->ScreenMode=(*srq)->sm_DisplayID;
- pref->ScreenWidth=(*srq)->sm_DisplayWidth;
- pref->ScreenHeight=(*srq)->sm_DisplayHeight;
- pref->ScreenDepth=(*srq)->sm_DisplayDepth;
- pref->OverscanType=(*srq)->sm_OverscanType;
- pref->AutoScroll=(*srq)->sm_AutoScroll;
- }
- }
- return(Result);
- }
-
-
- /*--------------------------------*/
- /* Close the GUI (Screen, Window) */
- /*--------------------------------*/
-
- void CloseGUI(struct Globals *glob, struct Prefs *pref)
- {
- if (glob->Window)
- {
- if (glob->Menu)
- {
- ClearMenuStrip(glob->Window);
-
- FreeMenus(glob->Menu);
- glob->Menu = NULL;
- }
-
- FreeGraphics(glob);
-
- ((struct Process*)MyTask)->pr_WindowPtr=glob->ProcWindow;
- glob->ProcWindow = NULL;
-
- if (glob->LockedScreen)
- {
- pref->WinX = glob->Window->LeftEdge;
- pref->WinY = glob->Window->TopEdge;
- pref->WinW = glob->ww;
- pref->WinH = glob->wh;
- }
-
- if (glob->AppWindow)
- {
- RemoveAppWindow(glob->AppWindow);
- glob->AppWindow = NULL;
- }
-
- CloseWindow(glob->Window);
- glob->Window = NULL;
- }
-
- if (glob->Screen)
- {
- if (glob->VisualInfo)
- {
- FreeVisualInfo(glob->VisualInfo);
- glob->VisualInfo = NULL;
- }
-
- if (glob->LockedScreen)
- {
- UnlockPubScreen(NULL, glob->LockedScreen);
- glob->LockedScreen = NULL;
- }
-
- if (glob->OpenedScreen)
- {
- if (CloseScreen(glob->OpenedScreen))
- glob->OpenedScreen = NULL;
- }
-
- glob->Screen = NULL;
- }
- }
-
-
- /*-----------------------------*/
- /* Calculate window dimensions */
- /*-----------------------------*/
-
- BOOL WindowLayout(struct Globals *glob, WORD *minw, WORD *minh, WORD *maxw, WORD *maxh)
- {
- BOOL Success = FALSE;
-
- *minw=64;
- *minh=64;
-
- *maxw=1024;
- *maxh=1024;
-
- if (glob->ww < *minw) glob->ww = *minw;
- if (glob->wh < *minh) glob->wh = *minh;
-
- if (glob->ww > *maxw) glob->ww = *maxw;
- if (glob->wh > *maxh) glob->wh = *maxh;
-
- Success=TRUE;
-
- return(Success);
- }
-
-
-
- /*-----------------*/
- /* Main event loop */
- /*-----------------*/
-
- UWORD NoteArray[128];
- UBYTE ChanUse[16];
-
- void MainLoop(struct Globals *glob, struct Prefs *pref)
- {
- UWORD Mask = 0xffff;
-
- BOOL Active;
- APTR fwdata;
-
- ULONG signals;
- ULONG gotsignals;
- struct IntuiMessage *imsg;
- ULONG Cl;
- UWORD Co;
- APTR IA;
-
- ULONG timersig = (1L << glob->treq->tr_node.io_Message.mn_ReplyPort->mp_SigBit);
- ULONG procsig = (1L << ((struct Process*)MyTask)->pr_MsgPort.mp_SigBit);
- ULONG winsig = (1L << glob->Window->UserPort->mp_SigBit);
- BOOL TimerActive = FALSE;
-
- UBYTE Err;
-
- Active=TRUE;
- glob->GUIRefresh=FALSE;
-
- memset(NoteArray,0,sizeof(NoteArray));
- memset(ChanUse ,0,sizeof(ChanUse ));
-
- Watch = FALSE;
- AddIntServer(INTB_VERTB, &VertBlank);
-
- glob->ww = glob->Window->Width - glob->Window->BorderLeft-glob->Window->BorderRight ;
- glob->wh = glob->Window->Height - glob->Window->BorderTop -glob->Window->BorderBottom;
-
- if (!(fwdata = (FWDefinitions[pref->FWMode].InitFireworks)(glob, pref)))
- {
- Message("Unable to initialize fireworks.", "Oh no");
- }
- else
- {
- signals = winsig | procsig | timersig | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_E;
-
- TimerActive = FALSE;
- SetTaskPri(MyTask, HIGHPRI);
-
- while(Active)
- {
- if (glob->GUIRefresh)
- {
- BOOL SaveWatch = Watch;
- Watch = FALSE;
-
- CloseGUI(glob, pref);
-
- if (!OpenGUI(glob, pref))
- {
- pref->Flags &= (~PREFF_FULLSCREEN);
-
- if (!OpenGUI(glob, pref))
- {
- Active = FALSE;
- break;
- }
- }
-
- TitleWindow(glob, "Fireworks [%s]%s", pref->Link, TimerActive ? "" : " [idle]");
-
- winsig = (1L << glob->Window->UserPort->mp_SigBit);
- signals = winsig | procsig | timersig | SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_E;
-
- if (fwdata) (FWDefinitions[pref->FWMode].RethinkWindow)(fwdata);
-
- glob->GUIRefresh = FALSE;
-
- Watch=SaveWatch;
- }
-
- gotsignals = Wait(signals);
-
- if (gotsignals & winsig)
- {
- while(Active && (imsg=(struct IntuiMessage*)GetMsg(glob->Window->UserPort)))
- {
- Cl=imsg->Class;
- Co=imsg->Code;
- IA=imsg->IAddress;
- ReplyMsg((struct Message*)imsg);
-
- if (Cl==IDCMP_CLOSEWINDOW)
- {
- if (AskAsync(glob))
- {
- Active=FALSE;
- break;
- }
- else
- AsyncMessage(glob,CloseTask, "Cannot quit yet. Please close all open requesters.","I will");
- }
-
- if (Cl==IDCMP_NEWSIZE)
- {
- BOOL SaveWatch = Watch;
- Watch = FALSE;
-
- glob->ww = pref->WinW = glob->Window->Width - glob->Window->BorderLeft-glob->Window->BorderRight ;
- glob->wh = pref->WinH = glob->Window->Height - glob->Window->BorderTop -glob->Window->BorderBottom;
-
- if (!(InitOrUpdateGraphics(glob, pref)))
- {
- Message("Failed to update graphics!",NULL);
- }
-
- if (glob->PaintBitMap)
- {
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
- }
- else EraseRect(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
-
- if (fwdata) (FWDefinitions[pref->FWMode].RethinkWindow)(fwdata);
-
- Watch = SaveWatch;
- }
-
- if (Cl==IDCMP_REFRESHWINDOW)
- {
- BeginRefresh( glob->Window );
-
- if (glob->PaintBitMap)
- {
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
- }
- else EraseRect(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
-
- EndRefresh( glob->Window, TRUE );
- }
-
- if (Cl==IDCMP_MENUPICK)
- {
- BOOL SaveWatch = Watch;
-
- struct MenuItem *n;
- ULONG pick;
-
- Watch = FALSE;
-
- while( (Co != MENUNULL) && Active)
- {
- n = ItemAddress( glob->Window->MenuStrip, (ULONG)Co );
- pick = (ULONG) GTMENUITEM_USERDATA( n );
-
- switch(pick)
- {
- case Menu_Link:
- {
- APTR listreq;
-
- if (!(listreq = AllocListRequest(
- LISTREQ_Screen, GetScreen(glob),
- LISTREQ_TitleText, "Select input link",
- TAG_DONE )))
- {
- Message("Couldn't allocate a list requester.",NULL);
- }
- else
- {
- if (pref->Link != pref->NewLink)
- {
- strncpy(pref->NewLink, (glob->link)->ml_Location->mcl_Node.ln_Name, sizeof(pref->NewLink));
- pref->NewLink[sizeof(pref->NewLink)-1] = 0;
- }
-
- if (SelectCluster( listreq, pref->NewLink, sizeof(pref->NewLink), TAG_DONE ))
- {
- if (strcmp((glob->link)->ml_Location->mcl_Node.ln_Name,pref->NewLink))
- {
- struct MidiLink *newlink;
-
- if (!(newlink = AddMidiLink(glob->midi, MLTYPE_Receiver,
- MLINK_Name, "VU Meter Link",
- MLINK_Location, pref->NewLink,
- MLINK_EventMask, CMF_Note|CMF_Mode,
- MLINK_Comment, "Fireworks [Input]",
- TAG_DONE)))
- {
- Message("Cannot create link to MIDI interface '%s'",NULL,pref->NewLink);
- }
- else
- {
- RemoveMidiLink( glob->link );
- FlushMidi ( glob->midi );
-
- glob->link = newlink;
- pref->Link = pref->NewLink;
-
- TitleWindow(glob, "Fireworks [%s]%s", pref->Link, TimerActive ? "" : " [idle]");
-
- memset(NoteArray,0,sizeof(NoteArray));
- memset(ChanUse ,0,sizeof(ChanUse ));
-
- if (fwdata) (FWDefinitions[pref->FWMode].FreeNoteData)(fwdata);
- }
- }
- }
- FreeListRequest(listreq);
- }
- }
- break;
-
- case Menu_Save:
- {
- AsyncMessage(glob,SaveTask, "Save Config\nIsn't implemented... eeeh!","Damn");
- }
- break;
-
- case Menu_About:
- {
- AsyncMessage(glob,AboutTask, "Fireworks\n© 1998 by Christian Buchner\nflowerp@eikon.e-technik.tu-muenchen.de","Cool");
- }
- break;
-
- case Menu_Quit:
- {
- if (AskAsync(glob))
- Active = FALSE;
- else
- AsyncMessage(glob,CloseTask, "Cannot quit yet. Please close all open requesters.","I will");
- }
- break;
-
- case Menu_Kill:
- {
- pref->Flags &= (~PREFF_BACKDROP);
-
- if (glob->dto)
- {
- SetAPen(glob->Window->RPort, glob->PenArray[Backgroundpen]);
- RectFill(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
-
- DisposeDTObject(glob->dto);
- glob->dto = NULL;
-
- if (!(InitOrUpdateGraphics(glob,pref)))
- {
- Message("Failed to update graphics!",NULL);
- }
-
- if (glob->PaintBitMap)
- {
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
- }
- else EraseRect(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
- }
- }
- break;
-
- case Menu_Load:
- {
- if (pref->Image != pref->NewImage)
- {
- strncpy(pref->NewImage, pref->Image, sizeof(pref->NewImage));
- pref->NewImage[sizeof(pref->NewImage)-1] = 0;
- }
-
- AsyncSelectImage(glob, pref);
- }
- break;
-
- case Menu_Tile:
- {
- if (n->Flags & CHECKED)
- pref->Flags |= PREFF_TILE;
- else
- pref->Flags &= (~PREFF_TILE);
-
- if (!(InitOrUpdateGraphics(glob,pref)))
- {
- Message("Failed to update graphics!",NULL);
- }
-
- if (glob->PaintBitMap)
- {
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
- }
- else EraseRect(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
- }
- break;
-
- case Menu_Fullscreen:
- {
- if (n->Flags & CHECKED)
- {
- if (pref->ScreenMode == -1L)
- {
- n->Flags &= (~CHECKED);
- AsyncSelectScreenMode(glob, pref);
- }
- else
- {
- pref->Flags |= PREFF_FULLSCREEN;
- glob->GUIRefresh = TRUE;
- }
- }
- else
- {
- glob->GUIRefresh = TRUE;
- pref->Flags &= (~PREFF_FULLSCREEN);
- }
- }
- break;
-
- case Menu_Screenmode:
- {
- AsyncSelectScreenMode(glob, pref);
- }
- break;
-
- case Menu_Mode1:
- case Menu_Mode2:
- case Menu_Mode3:
- {
- if (n->Flags & CHECKED)
- {
- UWORD NewMode = pick - Menu_Mode1;
- if (NewMode != pref->FWMode)
- {
- if (fwdata)
- {
- (FWDefinitions[pref->FWMode].ExitFireworks)(fwdata);
- fwdata = NULL;
- }
-
- pref->FWMode = NewMode;
-
- if (!(fwdata = (FWDefinitions[pref->FWMode].InitFireworks)(glob, pref)))
- {
- Message("Unable to initialize fireworks.", "Oh no");
- n->Flags &= (~CHECKED);
- }
- }
- }
- }
- break;
-
- case Menu_Double:
- {
- if (n->Flags & CHECKED)
- pref->Flags |= PREFF_DOUBLE;
- else
- pref->Flags &= (~PREFF_DOUBLE);
- }
- break;
-
- case Menu_Release:
- {
- memset(NoteArray,0,sizeof(NoteArray));
- memset(ChanUse ,0,sizeof(ChanUse ));
-
- if (fwdata) (FWDefinitions[pref->FWMode].TimePassed)(fwdata);
- if (fwdata) (FWDefinitions[pref->FWMode].ReleaseNotes)(fwdata);
- }
- break;
-
- case Menu_Play:
- {
- AsyncSelectAndPlay(glob, pref);
- };
- break;
-
- case Menu_Stop:
- {
- StopMIDI(glob,pref);
- }
- break;
- }
-
- Co = n->NextSelect;
- }
-
- Watch = SaveWatch;
- }
- }
- }
-
- if (Active && (gotsignals & SIGBREAKF_CTRL_E))
- {
- MidiMsg msg;
-
- if (fwdata) (FWDefinitions[pref->FWMode].TimePassed)(fwdata);
-
- while (GetMidi(glob->midi,&msg))
- {
- if (noteon(&msg))
- {
- UBYTE chn = msg.mm_Status & MS_ChanBits;
- UWORD note = msg.mm_Data1;
- UWORD cmsk = 1<<chn;
-
- // if ((Mask & cmsk) && !((NoteArray[note] & Mask)))
- // {
- // }
-
- if (!(NoteArray[note] & cmsk))
- {
- /* Channel wird benutzt */
- ChanUse[chn]++;
-
- NoteArray[note] |= cmsk;
-
- /* Note angeschlagen */
-
- if (fwdata) (FWDefinitions[pref->FWMode].NoteOn)(fwdata, chn, note, msg.mm_Data2);
- }
-
- }
- else
- {
- if (noteoff(&msg))
- {
- UBYTE chn = msg.mm_Status & MS_ChanBits;
- UWORD note = msg.mm_Data1;
- UWORD cmsk = 1<<chn;
-
- if (NoteArray[note] & cmsk)
- {
- /* Channel wird nicht mehr benutzt */
- ChanUse[chn]--;
-
- NoteArray[note] &= (~cmsk);
-
- /* Note losgelassen */
-
- if (fwdata) (FWDefinitions[pref->FWMode].NoteOff)(fwdata, chn, note);
- }
-
- // if ((Mask & cmsk) && (!(NoteArray[note] & Mask)))
- // {
- // }
- }
- else
- {
- if (modemsg(&msg))
- {
- UBYTE chn = msg.mm_Status & MS_ChanBits;
- UBYTE mode = msg.mm_Data1;
- UWORD note;
- UWORD cmsk = 1<<chn;
-
- if (mode == MM_AllOff)
- {
- for (note=0;note<128;note++)
- {
- if (NoteArray[note] & cmsk)
- {
- /* Channel wird nicht mehr benuzt */
- ChanUse[chn]--;
-
- if (fwdata) (FWDefinitions[pref->FWMode].NoteOff)(fwdata, chn, note);
-
- NoteArray[note] &= (~cmsk);
- }
-
- // if ((Mask & cmsk) && (!(NoteArray[note] & Mask)))
- // {
- // }
- }
- }
- }
- }
- }
- }
-
- if (Err = GetMidiErr(glob->midi))
- {
- if (Err & CMEF_MsgErr) AsyncMessage(glob,ErrTask, "MIDI Error: MsgErr!",NULL);
- if (Err & CMEF_BufferFull) AsyncMessage(glob,ErrTask, "MIDI Error: BufferFull!",NULL);
- if (Err & CMEF_SysExFull) AsyncMessage(glob,ErrTask, "MIDI Error: SysExFull!",NULL);
- if (Err & CMEF_ParseMem) AsyncMessage(glob,ErrTask, "MIDI Error: ParseMem!",NULL);
- if (Err & CMEF_RecvErr) AsyncMessage(glob,ErrTask, "MIDI Error: RecvErr!",NULL);
- if (Err & CMEF_RecvOverflow) AsyncMessage(glob,ErrTask, "MIDI Error: RecvOverflow!",NULL);
- if (Err & CMEF_SysExTooBig) AsyncMessage(glob,ErrTask, "MIDI Error: SysExTooBig!",NULL);
- }
-
- /* (re-)start timer if it isn't running */
- if (!TimerActive)
- {
- /* but only if there is something to display */
- if (fwdata) if (!(FWDefinitions[pref->FWMode].IsIdle)(fwdata))
- {
- glob->treq->tr_node.io_Command = TR_ADDREQUEST;
- glob->treq->tr_time.tv_secs = 0;
- glob->treq->tr_time.tv_micro = 1000000 / FPS;
- SendIO((struct IORequest*)glob->treq);
- TimerActive = TRUE;
- Watch = TRUE;
-
- TitleWindow(glob, "Fireworks [%s]", pref->Link);
- }
- }
- }
-
- if (Active && (gotsignals & timersig))
- {
- BOOL idle = TRUE;
-
- IdleCount = 0;
-
- if (fwdata) (FWDefinitions[pref->FWMode].TimePassed)(fwdata);
- if (fwdata) idle = (FWDefinitions[pref->FWMode].IsIdle)(fwdata);
-
- if (!idle)
- {
- glob->treq->tr_node.io_Command = TR_ADDREQUEST;
- glob->treq->tr_time.tv_secs = 0;
- glob->treq->tr_time.tv_micro = 1000000 / FPS;
- SendIO((struct IORequest*)glob->treq);
- }
- else
- {
- TimerActive = FALSE;
- Watch = FALSE;
- SetTaskPri(MyTask, HIGHPRI);
-
- TitleWindow(glob, "Fireworks [%s] [idle]", pref->Link);
- }
-
- if ((glob->BGBitMap) && (glob->PaintBitMap))
- {
- BltBitMapRastPort(glob->BGBitMap, 0, 0, &glob->PaintRP, 0, 0, glob->ww, glob->wh, 0xc0);
-
- if (fwdata) (FWDefinitions[pref->FWMode].DrawFireworks)(fwdata, Mask);
-
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
- }
-
- /* reset task priority if it has
- been modified by the watchdog */
- if (MyTask->tc_Node.ln_Pri != NORMPRI)
- {
- SetTaskPri(MyTask, NORMPRI);
- }
- }
-
- if (Active && (gotsignals & procsig))
- {
- struct AppMessage *appm;
-
- while(appm = (struct AppMessage*)GetMsg(& ((struct Process*)MyTask)->pr_MsgPort ))
- {
- if (appm->am_Type == AMTYPE_APPWINDOW)
- {
- BOOL SaveWatch = Watch;
- struct WBArg *arg = appm->am_ArgList;
- ULONG i;
-
- Watch = FALSE;
-
- for (i=0 ; i < appm->am_NumArgs ; i++, arg++)
- {
- BOOL IsPicture = FALSE;
- BOOL IsMIDI = FALSE;
-
- BPTR OldDir;
- BPTR lock;
-
- OldDir = CurrentDir(arg->wa_Lock);
-
- if (lock = Lock(arg->wa_Name, SHARED_LOCK))
- {
- struct DataType *dtn;
-
- if (dtn = ObtainDataTypeA (DTST_FILE, (APTR) lock, NULL))
- {
- if (dtn->dtn_Header->dth_GroupID == GID_PICTURE)
- {
- if (NameFromLock(lock, pref->NewImage, sizeof(pref->NewImage)))
- {
- pref->Image = pref->NewImage;
- IsPicture = TRUE;
- }
- }
- ReleaseDataType (dtn);
- }
-
- if (!IsPicture)
- {
- BPTR dupedlock;
- BPTR file;
-
- if (dupedlock = DupLock(lock))
- {
- if (file = OpenFromLock(dupedlock))
- {
- UBYTE header[20];
-
- if (Read(file, header, sizeof(header)) == sizeof(header))
- {
- if ( ((header[0] == 'M') &&
- (header[1] == 'T') &&
- (header[2] == 'h') &&
- (header[3] == 'd'))
-
- ||
-
- ((header[0] == 'X') &&
- (header[1] == 'P') &&
- (header[2] == 'K') &&
- (header[3] == 'F') &&
- (header[16]== 'M') &&
- (header[17]== 'T') &&
- (header[18]== 'h') &&
- (header[19]== 'd')) )
- {
- if (NameFromLock(lock, pref->MIDIFile, sizeof(pref->MIDIFile)))
- {
- IsMIDI = TRUE;
- }
- }
- }
- Close(file);
- } else UnLock(dupedlock);
- }
- }
- UnLock(lock);
- }
- CurrentDir(OldDir);
-
- if (IsPicture) LoadImage(glob, pref);
- else
- if (IsMIDI) PlayMIDI(glob, pref);
- else
- AsyncMessage(glob,DropTask, "Please drop only picture objects or MIDI files\ninto the Fireworks window.","Sorry");
- }
- Watch = SaveWatch;
- }
- ReplyMsg((struct Message*)appm);
- }
- }
-
- if (gotsignals & SIGBREAKF_CTRL_C)
- {
- if (AskAsync(glob))
- {
- Active = FALSE;
- Watch = FALSE;
- }
- else
- AsyncMessage(glob,CloseTask, "Cannot quit yet. Please close all open requesters.","I will");
- }
- }
-
- RemIntServer(INTB_VERTB, &VertBlank);
-
- if (TimerActive)
- {
- AbortIO((struct IORequest*)glob->treq);
- WaitIO((struct IORequest*)glob->treq);
- }
-
- if (fwdata)
- {
- (FWDefinitions[pref->FWMode].ExitFireworks)(fwdata);
- fwdata = NULL;
- }
- }
- }
-
-
- /*-----------------------------------*/
- /* Linear fireworks (straight lines) */
- /*-----------------------------------*/
-
- struct LinData
- {
- struct Globals *glob;
- struct Prefs *pref;
-
- ULONG curtime;
-
- WORD centx, centy;
- WORD divx, divy;
-
- struct MinList CrackerList;
-
- WORD fxtab[128], fytab[128];
- };
-
- #define SCALE 1024
-
- /* the firecrackers */
-
- struct LinearCracker
- {
- struct Node cr_node;
- UBYTE cr_chn; /* 0 - 15 */
- UBYTE cr_note; /* 0 - 127 */
- UBYTE cr_vel; /* 0 - 127 */
-
- LONG cr_starttime; /* time stamp of note on */
- LONG cr_stoptime; /* time stamp of note off */
- UWORD cr_savedlifetime; /* lifetime when ray hit border */
-
- WORD cr_fx; /* -SCALE to SCALE equals -1 to -1 */
- WORD cr_fy; /* -SCALE to SCALE equals -1 to -1 */
- };
-
- APTR Lin_InitFireworks(struct Globals *glob, struct Prefs *pref)
- {
- struct LinData *ld = NULL;
- UWORD i;
-
- if (ld = AllocVec(sizeof(struct LinData), MEMF_ANY|MEMF_CLEAR))
- {
- ld->glob = glob;
- ld->pref = pref;
-
- NewList((struct List*)&ld->CrackerList);
-
- /* pre-calculate angles of all possible 128 notes */
- for (i = 0 ; i < 128 ; i++)
- {
- float angle = PI - (float)i/127 * PI;
-
- ld->fxtab[i] = SCALE * cos(angle);
- ld->fytab[i] = SCALE * sin(angle);
- }
-
- Lin_RethinkWindow((APTR)ld);
-
- GetTimeDelta(); /* initialize delta counter */
- ld->curtime = 0; /* start at time counter 0 */
- }
-
- return((APTR)ld);
- }
-
- void Lin_RethinkWindow(APTR data)
- {
- struct LinData *ld = (struct LinData*) data;
- struct Globals *glob = ld->glob;
-
- /* Calculate ray scaling factors */
- ld->divx = SCALE * MAXCOORD / (glob->ww);
- ld->divy = SCALE * MAXCOORD / (glob->wh);
- ld->centx = CENTER_X * (glob->ww) / MAXCOORD;
- ld->centy = CENTER_Y * (glob->wh) / MAXCOORD;
- }
-
- void Lin_TimePassed(APTR data)
- {
- struct LinData *ld = (struct LinData*) data;
-
- ld->curtime += GetTimeDelta();
- }
-
- BOOL Lin_IsIdle(APTR data)
- {
- struct LinData *ld = (struct LinData*) data;
-
- if (IsListEmpty((struct List*)&ld->CrackerList))
- return(TRUE);
- else
- return(FALSE);
- }
-
- void Lin_DrawFireworks(APTR data, UWORD Mask)
- {
- struct LinData *ld = (struct LinData*) data;
- struct LinearCracker *cr, *ncr;
- struct Globals *glob = ld->glob;
- struct Prefs *pref = ld->pref;
-
- UWORD lifetime;
- UWORD deathtime;
- WORD sx1, sy1;
- WORD sx2, sy2;
- LONG lastpen = -1, newpen;
-
- for ( cr = (struct LinearCracker*) ld->CrackerList.mlh_Head ;
- ncr = (struct LinearCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- /* get the ray's lifetime information */
-
- if (cr->cr_savedlifetime == 0xffff)
- lifetime = (UWORD)(ld->curtime - cr->cr_starttime);
- else
- lifetime = cr->cr_savedlifetime;
-
- /* calculate ray starting points */
- sx1 = ld->centx + cr->cr_fx * lifetime / ld->divx;
- sy1 = ld->centy - cr->cr_fy * lifetime / ld->divy;
-
- if (cr->cr_savedlifetime == 0xffff)
- {
- if ((sx1 >= glob->ww) || (sy1 >= glob->wh) || (sx1 < 0) || (sy1 < 0))
- {
- /* Start of ray hit window borders */
- /* save the time this happened to prevent */
- /* the ray from growing longer than */
- /* graphic's clipping can handle safely */
- cr->cr_savedlifetime = lifetime;
- }
- }
-
- /* has ray already been stopped by a note off? */
- if (cr->cr_stoptime == -1)
- {
- /* no, still emmitting from the centre */
- sx2 = ld->centx;
- sy2 = ld->centy;
- }
- else
- {
- /* get the time when the note off occured */
- deathtime = (UWORD)(ld->curtime - cr->cr_stoptime);
-
- /* is the ray just a dot? */
- if (lifetime == deathtime)
- {
- sx2 = sx1;
- sy2 = sy1;
- }
- else
- {
- /* calculate ray ending points */
- sy2 = ld->centy - cr->cr_fy * deathtime / ld->divy;
- sx2 = ld->centx + cr->cr_fx * deathtime / ld->divx;
- }
- }
-
- /* see if the ray has disappeared */
- /* or exceeded his maximum lifetime of 60 seconds */
- if ((sx2 >= glob->ww) || (sy2 >= glob->wh) || (sx2 < 0) || (sy2 < 0) ||
- lifetime > 60000 )
- {
- Remove((struct Node*)cr);
- FreePooled(glob->NotePool,cr,sizeof(struct LinearCracker));
- }
- else
- {
- /* display this channel ? */
- if ((1<<cr->cr_chn) & Mask)
- {
- /* change pen if necessary */
- newpen = glob->PenArray[Channelpens+cr->cr_chn];
- if (lastpen != newpen)
- {
- SetAPen(&glob->PaintRP, newpen);
- lastpen = newpen;
- }
-
- /* draw the ray */
- Move(&glob->PaintRP, sx1, sy1);
- Draw(&glob->PaintRP, sx2, sy2);
-
- if (pref->Flags & PREFF_DOUBLE)
- {
- WORD dx, dy;
- dx = sx2 - sx1; if (dx<0) dx=-dx;
- dy = sy2 - sy1; if (dy<0) dy=-dy;
-
- if (dy >= dx)
- {
- Move(&glob->PaintRP, sx1+1, sy1);
- Draw(&glob->PaintRP, sx2+1, sy2);
- }
- else
- {
- Move(&glob->PaintRP, sx1, sy1+1);
- Draw(&glob->PaintRP, sx2, sy2+1);
- }
- }
- }
- }
- }
- }
-
- void Lin_NoteOn(APTR data, UBYTE chn, UBYTE note, UBYTE vel)
- {
- struct LinData *ld = (struct LinData*) data;
- struct Globals *glob = ld->glob;
- struct LinearCracker *cr;
-
- if (cr = AllocPooled(glob->NotePool, sizeof(struct LinearCracker)))
- {
- cr->cr_node.ln_Pri = chn;
-
- cr->cr_chn = chn;
- cr->cr_note = note;
- cr->cr_vel = vel;
-
- cr->cr_starttime = ld->curtime;
- cr->cr_stoptime = -1;
- cr->cr_savedlifetime = 0xffff;
-
- cr->cr_fx = ld->fxtab[note] * cr->cr_vel / 127;
- cr->cr_fy = ld->fytab[note] * cr->cr_vel / 127;
-
- /* sorted by channel num to speed up painting */
- Enqueue((struct List*)&ld->CrackerList, (struct Node*)cr);
- }
- }
-
- void Lin_NoteOff(APTR data, UBYTE chn, UBYTE note)
- {
- struct LinData *ld = (struct LinData*) data;
- struct LinearCracker *cr, *ncr;
-
- for ( cr = (struct LinearCracker*) ld->CrackerList.mlh_Head ;
- ncr = (struct LinearCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- if ( (cr->cr_chn == chn ) &&
- (cr->cr_note == note) &&
- (cr->cr_stoptime == -1) )
- {
- cr->cr_stoptime = ld->curtime;
- break;
- }
- }
- }
-
- void Lin_ReleaseNotes(APTR data)
- {
- struct LinData *ld = (struct LinData*) data;
- struct LinearCracker *cr, *ncr;
-
- for ( cr = (struct LinearCracker*) ld->CrackerList.mlh_Head ;
- ncr = (struct LinearCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- if (cr->cr_stoptime == -1) cr->cr_stoptime = ld->curtime;
- }
- }
-
- void Lin_FreeNoteData(APTR data)
- {
- struct LinData *ld = (struct LinData*) data;
- struct Globals *glob = ld->glob;
- struct LinearCracker *cr, *ncr;
-
- for ( cr = (struct LinearCracker*) ld->CrackerList.mlh_Head ;
- ncr = (struct LinearCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- Remove((struct Node*)cr);
- FreePooled(glob->NotePool,cr,sizeof(struct LinearCracker));
- }
- }
-
- void Lin_ExitFireworks(APTR data)
- {
- struct LinData *ld = (struct LinData*) data;
-
- if (ld)
- {
- Lin_FreeNoteData(data);
-
- FreeVec(ld);
- }
- }
-
-
-
- /*------------------------------------------*/
- /* Parabolic fireworks (gravity simulation) */
- /*------------------------------------------*/
-
- #define K 10
- #define MAXLIFETIME (K*MAXCOORD)
-
- struct ParData
- {
- struct Globals *glob;
- struct Prefs *pref;
-
- ULONG curtime;
-
- WORD centx, centy;
- WORD divx, divy;
- UWORD winscale;
-
- struct MinList CrackerList;
-
- WORD fxtab[128], fytab[128];
- WORD parabtable[MAXLIFETIME]; /* parabolic flight path */
- UWORD parabskip[MAXLIFETIME]; /* info for painting flight paths */
- };
-
- #define SCALE 1024
-
- /* the firecrackers */
-
- struct ParabolicCracker
- {
- struct Node cr_node;
- UBYTE cr_chn; /* 0 - 15 */
- UBYTE cr_note; /* 0 - 127 */
- UBYTE cr_vel; /* 0 - 127 */
-
- LONG cr_starttime; /* time stamp of note on */
- LONG cr_stoptime; /* time stamp of note off */
-
- WORD cr_fx; /* -SCALE to SCALE equals -1 to -1 */
- WORD cr_fy; /* -SCALE to SCALE equals -1 to -1 */
-
- UWORD cr_offset; /* offset to lifetime */
- WORD cr_coordoffset; /* offset to coordinate */
-
- UWORD cr_multiplier; /* time skip multiplier (-SCALE to SCALE) */
- };
-
- APTR Par_InitFireworks(struct Globals *glob, struct Prefs *pref)
- {
- struct ParData *pd = NULL;
- UWORD i;
- UWORD lt;
- WORD val;
-
- if (pd = AllocVec(sizeof(struct ParData), MEMF_ANY|MEMF_CLEAR))
- {
- pd->glob = glob;
- pd->pref = pref;
-
- NewList((struct List*)&pd->CrackerList);
-
- SetPointer(glob->Window, WaitPointer, 16, 16, -6, 0);
-
- /* pre-calculate angles of all possible 128 notes */
- for (i = 0 ; i < 128 ; i++)
- {
- float angle = PI - (float)i/127 * PI;
-
- pd->fxtab[i] = SCALE * cos(angle);
- pd->fytab[i] = SCALE * sin(angle);
- }
-
- val = -(MAXLIFETIME/2);
-
- for (lt=0 ; lt <= MAXLIFETIME/2 ; lt++, val++)
- {
- pd->parabtable[lt] = pd->parabtable[MAXLIFETIME-1-lt] =
- (LONG)(val * val) / ((MAXLIFETIME*MAXLIFETIME/4) / (K * MAXCOORD / 4));
- }
-
- if (pref->FWMode == ParabolicMode2)
- {
- val = -(MAXLIFETIME/2);
-
- for (lt=0 ; lt <= MAXLIFETIME/2 ; )
- {
- UWORD s = (64.0 * pow(1+4*(float)(val*val)/(MAXLIFETIME*MAXLIFETIME/4),1.5));
-
- for (i=0; i<16; i++)
- {
- pd->parabskip[lt] = pd->parabskip[MAXLIFETIME-1-lt] = s;
- lt++; val++;
- }
- }
- }
-
- ClearPointer(glob->Window);
-
- Par_RethinkWindow((APTR)pd);
-
- GetTimeDelta(); /* initialize delta counter */
- pd->curtime = 0; /* start at time counter 0 */
- }
-
- return((APTR)pd);
- }
-
- void Par_RethinkWindow(APTR data)
- {
- struct ParData *pd = (struct ParData*) data;
- struct Globals *glob = pd->glob;
-
- /* Calculate ray scaling factors */
- pd->divx = SCALE * MAXCOORD / (glob->ww);
- pd->divy = MAXCOORD / (glob->wh);
- pd->centx = CENTER_X * (glob->ww) / MAXCOORD;
- pd->centy = CENTER_Y * (glob->wh) / MAXCOORD;
-
- pd->winscale = SCALE * (3 * MAXCOORD) / (glob->ww + glob->wh + MAXCOORD);
- }
-
- void Par_TimePassed(APTR data)
- {
- struct ParData *pd = (struct ParData*) data;
-
- pd->curtime += GetTimeDelta();
- }
-
- BOOL Par_IsIdle(APTR data)
- {
- struct ParData *pd = (struct ParData*) data;
-
- if (IsListEmpty((struct List*)&pd->CrackerList))
- return(TRUE);
- else
- return(FALSE);
- }
-
- void Par_DrawFireworks(APTR data, UWORD Mask)
- {
- struct ParData *pd = (struct ParData*) data;
- struct ParabolicCracker *cr, *ncr;
- struct Globals *glob = pd->glob;
- struct Prefs *pref = pd->pref;
-
- UWORD lifetime;
- UWORD lt;
- WORD sx1, sy1;
- LONG lastpen = -1, newpen;
-
- for ( cr = (struct ParabolicCracker*) pd->CrackerList.mlh_Head ;
- ncr = (struct ParabolicCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- /* get the pixel's lifetime information */
-
- lifetime = (UWORD)(pd->curtime - cr->cr_starttime);
- lt = lifetime + cr->cr_offset;
- if (lt >= MAXLIFETIME) lt = MAXLIFETIME-1;
-
- /* calculate pixel coordinate */
- sx1 = pd->centx + cr->cr_fx * lifetime / pd->divx;
- sy1 = pd->centy
- + (pd->parabtable[lt] - cr->cr_coordoffset) / pd->divy;
-
- /* see if the pixel has disappeared */
- /* or exceeded his maximum lifetime */
- if ( (sx1 >= glob->ww) || (sy1 >= glob->wh) || (sx1 < 0) ||
- lt >= (MAXLIFETIME-1) )
- {
- Remove((struct Node*)cr);
- FreePooled(glob->NotePool,cr,sizeof(struct ParabolicCracker));
- }
- else
- {
- /* display this channel ? */
- if ((1<<cr->cr_chn) & Mask)
- {
- /* change pen if necessary */
- newpen = glob->PenArray[Channelpens+cr->cr_chn];
- if (lastpen != newpen)
- {
- SetAPen(&glob->PaintRP, newpen);
- lastpen = newpen;
- }
-
- if ((sx1 >= 0) && (sy1 >= 0))
- {
- struct Layer *SaveLayer = glob->PaintRP.Layer;
- glob->PaintRP.Layer = NULL;
-
- if (!(pref->Flags & PREFF_DOUBLE))
- {
- if ((sx1 < (glob->ww )) && (sy1 < (glob->wh )))
- {
- /* draw the pixel */
- WritePixel(&glob->PaintRP, sx1, sy1);
- }
- }
- else
- {
- if ((sx1 < (glob->ww-1)) && (sy1 < (glob->wh-1)))
- {
- WritePixel(&glob->PaintRP, sx1 , sy1 );
- WritePixel(&glob->PaintRP, sx1+1, sy1 );
- WritePixel(&glob->PaintRP, sx1 , sy1+1);
- WritePixel(&glob->PaintRP, sx1+1, sy1+1);
- }
- }
- glob->PaintRP.Layer = SaveLayer;
- }
- }
- }
- }
- }
-
- void Par_NoteOn(APTR data, UBYTE chn, UBYTE note, UBYTE vel)
- {
- struct ParData *pd = (struct ParData*) data;
- struct Globals *glob = pd->glob;
- struct ParabolicCracker *cr;
- WORD absfx;
-
- if (cr = AllocPooled(glob->NotePool, sizeof(struct ParabolicCracker)))
- {
- cr->cr_node.ln_Pri = chn;
-
- cr->cr_chn = chn;
- cr->cr_note = note;
- cr->cr_vel = vel;
-
- cr->cr_starttime = pd->curtime;
- cr->cr_stoptime = -1;
- cr->cr_fx = pd->fxtab[note] * cr->cr_vel / 127;
- cr->cr_fy = pd->fytab[note] * cr->cr_vel / 127;
-
- cr->cr_offset = (MAXLIFETIME/2) * (SCALE-cr->cr_fy) / SCALE;
- cr->cr_coordoffset = pd->parabtable[cr->cr_offset];
-
- absfx = cr->cr_fx;
- if (absfx < 0) absfx = -absfx;
-
- cr->cr_multiplier = (SCALE - absfx);
-
- /* sorted by channel num to speed up painting */
- Enqueue((struct List*)&pd->CrackerList, (struct Node*)cr);
- }
- }
-
- void Par_NoteOff(APTR data, UBYTE chn, UBYTE note)
- {
- struct ParData *pd = (struct ParData*) data;
- struct ParabolicCracker *cr, *ncr;
-
- for ( cr = (struct ParabolicCracker*) pd->CrackerList.mlh_Head ;
- ncr = (struct ParabolicCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- if ( (cr->cr_chn == chn ) &&
- (cr->cr_note == note) &&
- (cr->cr_stoptime == -1) )
- {
- cr->cr_stoptime = pd->curtime;
- break;
- }
- }
- }
-
- void Par_ReleaseNotes(APTR data)
- {
- struct ParData *pd = (struct ParData*) data;
- struct ParabolicCracker *cr, *ncr;
-
- for ( cr = (struct ParabolicCracker*) pd->CrackerList.mlh_Head ;
- ncr = (struct ParabolicCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- if (cr->cr_stoptime == -1) cr->cr_stoptime = pd->curtime;
- }
- }
-
- void Par_FreeNoteData(APTR data)
- {
- struct ParData *pd = (struct ParData*) data;
- struct Globals *glob = pd->glob;
- struct ParabolicCracker *cr, *ncr;
-
- for ( cr = (struct ParabolicCracker*) pd->CrackerList.mlh_Head ;
- ncr = (struct ParabolicCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- Remove((struct Node*)cr);
- FreePooled(glob->NotePool,cr,sizeof(struct ParabolicCracker));
- }
- }
-
- void Par_ExitFireworks(APTR data)
- {
- struct ParData *pd = (struct ParData*) data;
-
- if (pd)
- {
- Par_FreeNoteData(data);
-
- FreeVec(pd);
- }
- }
-
-
-
- /*-------------------------------------*/
- /* Parabolic rays (gravity simulation) */
- /*-------------------------------------*/
-
- void Par_DrawFireworks2(APTR data, UWORD Mask)
- {
- struct ParData *pd = (struct ParData*) data;
- struct ParabolicCracker *cr, *ncr;
- struct Globals *glob = pd->glob;
- struct Prefs *pref = pd->pref;
-
- UWORD lifetime;
- UWORD deathtime;
- UWORD lt, dt, t;
- WORD sx1, sy1;
- WORD sx2, sy2;
- WORD dx, dy;
- LONG lastpen = -1, newpen;
-
- for ( cr = (struct ParabolicCracker*) pd->CrackerList.mlh_Head ;
- ncr = (struct ParabolicCracker*) cr->cr_node.ln_Succ ;
- cr = ncr )
- {
- /* get the parabolic ray's lifetime information */
-
- lifetime = (UWORD)(pd->curtime - cr->cr_starttime);
- lt = lifetime + cr->cr_offset;
- if (lt >= MAXLIFETIME) lt = MAXLIFETIME-1;
-
- /* has ray already been stopped by a note off? */
- if (cr->cr_stoptime == -1)
- {
- deathtime = 0;
- }
- else
- {
- deathtime = (UWORD)(pd->curtime - cr->cr_stoptime);
- }
-
- dt = deathtime + cr->cr_offset;
- if (dt >= MAXLIFETIME) dt = MAXLIFETIME-1;
-
- /* calculate parabolic ray coordinate */
- sx1 = pd->centx + cr->cr_fx * deathtime / pd->divx;
- sy1 = pd->centy
- + (pd->parabtable[dt] - cr->cr_coordoffset) / pd->divy;
-
- /* see if the parabolic ray has disappeared */
- /* or exceeded his maximum lifetime */
- if ( (sx1 >= glob->ww) || (sy1 >= glob->wh) || (sx1 < 0) ||
- dt >= (MAXLIFETIME-1) )
- {
- Remove((struct Node*)cr);
- FreePooled(glob->NotePool,cr,sizeof(struct ParabolicCracker));
- }
- else
- {
- /* display this channel ? */
- if ((1<<cr->cr_chn) & Mask)
- {
- /* change pen if necessary */
- newpen = glob->PenArray[Channelpens+cr->cr_chn];
- if (lastpen != newpen)
- {
- SetAPen(&glob->PaintRP, newpen);
- lastpen = newpen;
- }
-
- if (lifetime == deathtime)
- {
- /* This handles the ray like a pixel */
-
- if ((sx1 >= 0) && (sy1 >= 0))
- {
- struct Layer *SaveLayer = glob->PaintRP.Layer;
- glob->PaintRP.Layer = NULL;
-
- if (!(pref->Flags & PREFF_DOUBLE))
- {
- if ((sx1 < (glob->ww )) && (sy1 < (glob->wh )))
- {
- /* draw the pixel */
- WritePixel(&glob->PaintRP, sx1, sy1);
- }
- }
- else
- {
- if ((sx1 < (glob->ww-1)) && (sy1 < (glob->wh-1)))
- {
- WritePixel(&glob->PaintRP, sx1 , sy1 );
- WritePixel(&glob->PaintRP, sx1+1, sy1 );
- WritePixel(&glob->PaintRP, sx1 , sy1+1);
- WritePixel(&glob->PaintRP, sx1+1, sy1+1);
- }
- }
- glob->PaintRP.Layer = SaveLayer;
- }
- }
- else
- {
- BOOL Clean = FALSE;
- BOOL Invisible = FALSE;
- struct Layer *SaveLayer = glob->PaintRP.Layer;
-
- Move(&glob->PaintRP, sx1, sy1);
-
- for ( t=dt ; t<lt ; )
- {
- UWORD skip = pd->parabskip[t]
- * cr->cr_multiplier / SCALE
- * pd->winscale / SCALE;
-
- if (skip == 0) skip = 1;
-
- deathtime += skip;
- t += skip;
-
- if (t>lt)
- {
- t=lt;
- deathtime=lifetime;
- }
-
- if (sy1 < 0) Invisible = TRUE;
-
- if ((sx1 >= (glob->ww)) || (sx1 < 0) || (sy1 > (glob->wh)))
- break;
-
- sx2 = sx1;
- sy2 = sy1;
-
- sx1 = pd->centx + cr->cr_fx * deathtime / pd->divx;
- sy1 = pd->centy
- + (pd->parabtable[t] - cr->cr_coordoffset) / pd->divy;
-
- if (Invisible)
- {
- if (sy1 >= 0)
- {
- Move(&glob->PaintRP, sx2, sy2);
- Invisible = FALSE;
- }
- }
-
- if (!Invisible)
- {
- if ((sx1 >= 0) && (sx1 < (glob->ww)) &&
- (sy1 >= 0) && (sy1 < (glob->wh)) )
- {
- if (Clean)
- glob->PaintRP.Layer = NULL;
- else
- Clean = TRUE;
- }
- else
- {
- if (Clean)
- {
- glob->PaintRP.Layer = SaveLayer;
- Clean = FALSE;
- }
- }
-
- Draw(&glob->PaintRP, sx1, sy1);
- //WritePixel(&glob->PaintRP, sx1, sy1);
-
- if (pref->Flags & PREFF_DOUBLE)
- {
- struct Layer *Save2 = glob->PaintRP.Layer;
-
- if ((sx1 >= 0) && (sx2 >=0) &&
- (sy1 >= 0) && (sy2 >=0) &&
- (sx1 < (glob->ww-1)) && (sy1 < (glob->wh-1)) &&
- (sx2 < (glob->ww-1)) && (sy2 < (glob->wh-1)))
- {
- glob->PaintRP.Layer = NULL;
- }
- else
- {
- glob->PaintRP.Layer = SaveLayer;
- }
-
- dx = sx2 - sx1; if (dx<0) dx=-dx;
- dy = sy2 - sy1; if (dy<0) dy=-dy;
-
- if (dy >= dx)
- {
- Move(&glob->PaintRP, sx2+1, sy2);
- Draw(&glob->PaintRP, sx1+1, sy1);
- }
- else
- {
- Move(&glob->PaintRP, sx2, sy2+1);
- Draw(&glob->PaintRP, sx1, sy1+1);
- }
-
- Move(&glob->PaintRP, sx1, sy1);
-
- glob->PaintRP.Layer = Save2;
- }
- }
- }
-
- glob->PaintRP.Layer = SaveLayer;
- }
- }
- }
- }
- }
-
-
-
- /*----------------------------------------*/
- /* VBR Interrupt handler (Watchdog timer) */
- /*----------------------------------------*/
-
- int __interrupt __saveds VBlankInterface( void )
- {
- if (Watch)
- {
- if (IdleCount++ >= (50/MIN_FPS))
- {
- SetTaskPri(MyTask, HIGHPRI);
- IdleCount = 0;
- }
- }
- return 0; /* server chain continues */
- }
-
-
-
- /*------------------------------------*/
- /* Asynchronously select a screenmode */
- /*------------------------------------*/
-
- struct SMData
- {
- struct Message Message;
- struct Globals *glob;
- struct Prefs *pref;
- };
-
- void SyncSelectScreenMode(struct Globals *glob, struct Prefs *pref)
- {
- if (SelectScreenMode(glob, pref, &glob->ScreenModeRQ))
- {
- pref->Flags |= PREFF_FULLSCREEN;
- glob->GUIRefresh = TRUE;
- Signal(MyTask, SIGBREAKF_CTRL_E); /* wake up main task */
- }
- }
-
- void __saveds AsyncSelectScreenModeTask(void)
- {
- struct SMData *smd;
- struct Process *MyProc = (struct Process*)FindTask(NULL);
- struct Globals *glob;
- struct Prefs *pref;
-
- WaitPort(&MyProc->pr_MsgPort);
- if (smd = (struct SMData*)GetMsg(&MyProc->pr_MsgPort))
- {
- glob = smd->glob;
- pref = smd->pref;
- SyncSelectScreenMode(glob,pref);
-
- FreeVec(smd);
-
- Forbid();
- FreeAsync(glob, ScreenTask);
- }
- }
-
- void AsyncSelectScreenMode(struct Globals *glob, struct Prefs *pref)
- {
- struct SMData *smd;
- struct Process *proc;
- BOOL Success = FALSE;
-
- if (AllocAsync(glob, ScreenTask))
- {
- if (smd = AllocVec(sizeof(struct SMData), MEMF_ANY|MEMF_CLEAR))
- {
- if (proc = CreateNewProcTags(
- NP_Entry, &AsyncSelectScreenModeTask,
- NP_Name, "Fireworks screenmode selection task",
- NP_Priority, 0,
- NP_Input, Input(),
- NP_Output, Output(),
- NP_CloseInput, FALSE,
- NP_CloseOutput, FALSE,
- TAG_DONE))
- {
- smd->Message.mn_ReplyPort = NULL;
- smd->Message.mn_Length = sizeof(struct SMData);
-
- smd->glob = glob;
- smd->pref = pref;
-
- PutMsg(&proc->pr_MsgPort, (struct Message*)smd);
-
- Success = TRUE;
- }
- if (!Success) FreeVec(smd);
- }
- if (!Success) FreeAsync(glob, ScreenTask);
- } else Success = TRUE;
-
- if (!Success)
- {
- SyncSelectScreenMode(glob, pref);
- }
- }
-
-
-
- /*---------------------------------------------------*/
- /* Asynchronously select an image and notify program */
- /*---------------------------------------------------*/
-
- struct SIData
- {
- struct Message Message;
- struct Globals *glob;
- struct Prefs *pref;
- };
-
- void __saveds AsyncSelectImageTask(void)
- {
- struct SIData *sid;
- struct Process *MyProc = (struct Process*)FindTask(NULL);
- struct Globals *glob;
- struct Prefs *pref;
- BOOL Success = FALSE;
- UBYTE *filename;
- UBYTE *ptr, save;
- BPTR dirlock;
- ULONG msglen;
- struct AppMessage *appm,*got;
- struct WBArg *argument;
- UBYTE *name;
-
- WaitPort(&MyProc->pr_MsgPort);
- if (sid = (struct SIData*)GetMsg(&MyProc->pr_MsgPort))
- {
- glob = sid->glob;
- pref = sid->pref;
-
- if (SelectImage(glob, &glob->ImageFR, pref->NewImage, sizeof(pref->NewImage)))
- {
- pref->Image = pref->NewImage;
- pref->Flags |= PREFF_BACKDROP;
-
- /* now fake an AppMessage to notify program of image change */
-
- filename = FilePart(pref->Image);
-
- ptr = PathPart(pref->Image);
- save = *ptr;
- *ptr = 0;
-
- if (dirlock = Lock(pref->Image, SHARED_LOCK))
- {
- *ptr = save;
- msglen = sizeof(struct AppMessage)+sizeof(struct WBArg)+strlen(filename)+1;
-
- if (appm = AllocVec(msglen,MEMF_ANY|MEMF_CLEAR))
- {
- argument = (struct WBArg*)(appm+1);
- name = (UBYTE*)(argument+1);
-
- appm->am_Message.mn_Length = msglen;
- appm->am_Message.mn_ReplyPort = &MyProc->pr_MsgPort;
-
- appm->am_Type = AMTYPE_APPWINDOW;
- appm->am_NumArgs = 1;
- appm->am_ArgList = argument;
-
- argument->wa_Lock = dirlock;
- argument->wa_Name = name;
-
- strcpy(name, filename);
-
- PutMsg(&((struct Process*)MyTask)->pr_MsgPort, (struct Message*)appm);
-
- got = NULL;
- while (got != appm)
- {
- WaitPort(&MyProc->pr_MsgPort);
- got = (struct AppMessage*)GetMsg(&MyProc->pr_MsgPort);
- }
- FreeVec(appm);
-
- Success = TRUE;
- }
- UnLock(dirlock);
- }
- if (!Success) *ptr = save;
- }
-
- FreeVec(sid);
-
- Forbid();
- FreeAsync(glob, ImageTask);
- }
- }
-
- void AsyncSelectImage(struct Globals *glob, struct Prefs *pref)
- {
- BOOL Success = FALSE;
- struct SIData *sid;
- struct Process *proc;
-
- if (AllocAsync(glob, ImageTask))
- {
- if (sid = AllocVec(sizeof(struct SIData), MEMF_ANY|MEMF_CLEAR))
- {
- if (proc = CreateNewProcTags(
- NP_Entry, &AsyncSelectImageTask,
- NP_Name, "Fireworks image selection task",
- NP_Priority, 0,
- NP_Input, Input(),
- NP_Output, Output(),
- NP_CloseInput, FALSE,
- NP_CloseOutput, FALSE,
- TAG_DONE))
- {
- sid->Message.mn_ReplyPort = NULL;
- sid->Message.mn_Length = sizeof(struct SIData);
-
- sid->glob = glob;
- sid->pref = pref;
-
- PutMsg(&proc->pr_MsgPort, (struct Message*)sid);
-
- Success = TRUE;
- }
- if (!Success) FreeVec(sid);
- }
- if (!Success) FreeAsync(glob, ImageTask);
- } else Success = TRUE;
-
- if (!Success)
- {
- if (SelectImage(glob, &glob->ImageFR, pref->NewImage, sizeof(pref->NewImage)))
- {
- pref->Image = pref->NewImage;
- pref->Flags |= PREFF_BACKDROP;
- LoadImage(glob,pref);
- }
- }
- }
-
-
-
- /*------------------------------------------*/
- /* Asynchronously select & play a MIDI file */
- /*------------------------------------------*/
-
- struct SPData
- {
- struct Message Message;
- struct Globals *glob;
- struct Prefs *pref;
- };
-
- void SelectAndPlay(struct Globals *glob, struct Prefs *pref)
- {
- if (SelectMIDI(glob, &glob->MIDIFR, pref->MIDIFile,sizeof(pref->MIDIFile)))
- {
- PlayMIDI(glob,pref);
- }
- }
-
- void __saveds AsyncSelectAndPlayTask(void)
- {
- struct SPData *spd;
- struct Process *MyProc = (struct Process*)FindTask(NULL);
- struct Globals *glob;
- struct Prefs *pref;
-
- WaitPort(&MyProc->pr_MsgPort);
- if (spd = (struct SPData*)GetMsg(&MyProc->pr_MsgPort))
- {
- glob = spd->glob;
- pref = spd->pref;
- SelectAndPlay(glob,pref);
-
- FreeVec(spd);
-
- Forbid();
- FreeAsync(glob, PlayTask);
- }
- }
-
- void AsyncSelectAndPlay(struct Globals *glob, struct Prefs *pref)
- {
- BOOL Success = FALSE;
- struct SPData *spd;
- struct Process *proc;
-
- if (AllocAsync(glob, PlayTask))
- {
- if (spd = AllocVec(sizeof(struct SPData), MEMF_ANY|MEMF_CLEAR))
- {
- if (proc = CreateNewProcTags(
- NP_Entry, &AsyncSelectAndPlayTask,
- NP_Name, "Fireworks MIDI selection task",
- NP_Priority, 0,
- NP_Input, Input(),
- NP_Output, Output(),
- NP_CloseInput, FALSE,
- NP_CloseOutput, FALSE,
- TAG_DONE))
- {
- spd->Message.mn_ReplyPort = NULL;
- spd->Message.mn_Length = sizeof(struct SPData);
-
- spd->glob = glob;
- spd->pref = pref;
-
- PutMsg(&proc->pr_MsgPort, (struct Message*)spd);
-
- Success = TRUE;
- }
- if (!Success) FreeVec(spd);
- }
- if (!Success) FreeAsync(glob, PlayTask);
- } else Success = TRUE;
-
- if (!Success)
- {
- SelectAndPlay(glob, pref);
- }
- }
-
-
-
- /*----------------------------*/
- /* Initialize/Update Graphics */
- /*----------------------------*/
-
- BOOL InitOrUpdateGraphics(struct Globals *glob, struct Prefs *pref)
- {
- BOOL Success = FALSE;
-
- if (glob->PaintLayer)
- {
- DeleteLayer(0, glob->PaintLayer);
- glob->PaintLayer = NULL;
- }
-
- if (glob->BGBitMap)
- {
- FreeBitMap(glob->BGBitMap);
- glob->BGBitMap = NULL;
- }
-
- if (glob->PaintBitMap)
- {
- FreeBitMap(glob->PaintBitMap);
- glob->PaintBitMap = NULL;
- }
-
- if (glob->Window)
- {
- UWORD i;
- struct ColorMap *cmap = glob->Window->WScreen->ViewPort.ColorMap;
-
- struct BitMap *friend = glob->Window->RPort->BitMap;
- ULONG depth = GetBitMapAttr(friend, BMA_DEPTH);
- ULONG flags = GetBitMapAttr(friend, BMA_FLAGS);
-
- struct RastPort BGRP;
-
- SetPointer(glob->Window, WaitPointer, 16, 16, -6, 0);
-
- for (i = 0 ; i < NUMPENS ; i++)
- {
- if (glob->PenArray[i] == -1L)
- {
- glob->PenArray[i] = ObtainBestPen(
- cmap,
- (ULONG)PenColors[i][0]<<24,
- (ULONG)PenColors[i][1]<<24,
- (ULONG)PenColors[i][2]<<24,
- OBP_Precision, PRECISION_IMAGE,
- TAG_DONE );
- }
- }
-
- /* Cybergraphics kludge */
- if ( !(flags & BMF_STANDARD) ) flags |= BMF_MINPLANES;
-
- if (glob->BGBitMap = AllocBitMap(glob->ww, glob->wh, depth, flags | BMF_CLEAR, friend))
- {
- struct BitMap *ImageBM = NULL;
- struct BitMapHeader *bmh = NULL;
-
- InitRastPort(&BGRP);
- BGRP.BitMap = glob->BGBitMap;
-
- SetAPen(&BGRP, glob->PenArray[Backgroundpen]);
-
- if (glob->dto)
- {
- GetDTAttrs(glob->dto, PDTA_DestBitMap, &ImageBM,
- PDTA_BitMapHeader, &bmh,
- TAG_DONE);
- }
-
- if ((!ImageBM) || (!bmh))
- {
- RectFill(&BGRP, 0, 0, (glob->ww)-1, (glob->wh)-1);
- }
- else
- {
- UWORD width = bmh->bmh_Width;
- UWORD height= bmh->bmh_Height;
-
- if (pref->Flags & PREFF_TILE)
- {
- UWORD x,y;
- UWORD dow, doh;
-
- for (y = 0 ; y < glob->wh ; y += doh)
- {
- doh = height;
-
- if (y + doh > glob->wh)
- doh = glob->wh - y;
-
- for (x = 0 ; x < glob->ww ; x += dow)
- {
- dow = width;
-
- if (x + dow > glob->ww)
- dow = glob->ww - x;
-
- BltBitMap(ImageBM, 0, 0, glob->BGBitMap, x, y, dow, doh, 0xc0, 0xff,NULL);
- }
- }
- }
- else
- {
- struct BitScaleArgs bsa;
-
- bsa.bsa_SrcX = 0;
- bsa.bsa_SrcY = 0;
- bsa.bsa_SrcWidth = width;
- bsa.bsa_SrcHeight = height;
- bsa.bsa_XSrcFactor = width;
- bsa.bsa_YSrcFactor = height;
- bsa.bsa_DestX = 0;
- bsa.bsa_DestY = 0;
- bsa.bsa_DestWidth = glob->ww;
- bsa.bsa_DestHeight = glob->wh;
- bsa.bsa_XDestFactor = glob->ww;
- bsa.bsa_YDestFactor = glob->wh;
- bsa.bsa_SrcBitMap = ImageBM;
- bsa.bsa_DestBitMap = glob->BGBitMap;
- bsa.bsa_Flags = 0;
- bsa.bsa_XDDA = 0;
- bsa.bsa_YDDA = 0;
- bsa.bsa_Reserved1 = 0;
- bsa.bsa_Reserved2 = 0;
-
- BitMapScale(&bsa);
- }
- }
-
- if ( glob->PaintBitMap = AllocBitMap(glob->ww, glob->wh, depth, flags | BMF_CLEAR, friend))
- {
- InitRastPort(&glob->PaintRP);
- glob->PaintRP.BitMap = glob->PaintBitMap;
-
- if (!(glob->LInfo)) glob->LInfo = NewLayerInfo();
-
- if (glob->LInfo)
- {
- if (glob->PaintLayer = CreateUpfrontLayer(glob->LInfo, glob->PaintBitMap, 0, 0, (glob->ww)-1, (glob->wh)-1, LAYERSMART, NULL))
- {
- glob->PaintRP.Layer = glob->PaintLayer;
-
- BltBitMapRastPort(glob->BGBitMap, 0, 0, &glob->PaintRP, 0, 0, glob->ww, glob->wh, 0xc0);
-
- Success = TRUE;
- }
- }
- }
- }
- ClearPointer(glob->Window);
- }
-
- if (!Success)
- {
- if (glob->PaintLayer)
- {
- DeleteLayer(0, glob->PaintLayer);
- glob->PaintLayer = NULL;
- }
-
- if (glob->BGBitMap)
- {
- FreeBitMap(glob->BGBitMap);
- glob->BGBitMap = NULL;
- }
-
- if (glob->PaintBitMap)
- {
- FreeBitMap(glob->PaintBitMap);
- glob->PaintBitMap = NULL;
- }
- }
-
- return(Success);
- }
-
-
-
- /*-------------------------*/
- /* Free allocated Graphics */
- /*-------------------------*/
-
- void FreeGraphics(struct Globals *glob)
- {
- UWORD i;
-
- if (glob->dto)
- {
- SetAPen(glob->Window->RPort, glob->PenArray[Backgroundpen]);
- RectFill(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
-
- DisposeDTObject(glob->dto);
- glob->dto = NULL;
- }
-
- if (glob->PaintLayer)
- {
- DeleteLayer(0, glob->PaintLayer);
- glob->PaintLayer = NULL;
- }
-
- if (glob->LInfo)
- {
- DisposeLayerInfo(glob->LInfo);
- glob->LInfo = NULL;
- }
-
- if (glob->BGBitMap)
- {
- FreeBitMap(glob->BGBitMap);
- glob->BGBitMap = NULL;
- }
-
- if (glob->PaintBitMap)
- {
- FreeBitMap(glob->PaintBitMap);
- glob->PaintBitMap = NULL;
- }
-
- if (glob->Window)
- {
- struct ColorMap *cmap = glob->Window->WScreen->ViewPort.ColorMap;
-
- for (i = 0 ; i < NUMPENS ; i++)
- {
- if (glob->PenArray[i] != -1L)
- {
- ReleasePen( cmap, glob->PenArray[i] );
- glob->PenArray[i] = -1L;
- }
- }
- }
- }
-
-
-
- /*--------------------*/
- /* Get current screen */
- /*--------------------*/
-
- struct Screen *GetScreen(struct Globals *glob)
- {
- struct Window *win;
- struct Screen *scr = NULL;
-
- if (MyTask)
- {
- win = ((struct Window*)((struct Process*)MyTask)->pr_WindowPtr);
- if (win) scr = win->WScreen;
- }
-
- if (!scr)
- {
- if (glob->LockedScreen)
- scr = glob->LockedScreen;
- else
- scr = glob->LockedScreen = LockPubScreen(NULL);
- }
-
- return(scr);
- }
-
-
-
-
- /*----------------------------------*/
- /* Load image using datatypes (V43) */
- /*----------------------------------*/
-
- void LoadImage(struct Globals *glob, struct Prefs *pref)
- {
- if (glob->dto)
- {
- SetAPen(glob->Window->RPort, glob->PenArray[Backgroundpen]);
- RectFill(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
-
- DisposeDTObject(glob->dto);
- glob->dto = NULL;
- }
-
- SetPointer(glob->Window, WaitPointer, 16, 16, -6, 0);
-
- if (glob->dto = (Object *) NewDTObject(pref->Image,
- DTA_GroupID, GID_PICTURE,
- PDTA_DestMode, MODE_V43,
- PDTA_Remap, TRUE,
- PDTA_Screen, GetScreen(glob),
- PDTA_FreeSourceBitMap, TRUE,
- TAG_DONE) )
- {
- SetDTAttrs(glob->dto, NULL, NULL,
- PDTA_Remap, TRUE,
- PDTA_Screen, GetScreen(glob),
- PDTA_FreeSourceBitMap, TRUE,
- PDTA_UseFriendBitMap, TRUE,
- TAG_DONE );
-
- DoMethod( glob->dto, DTM_PROCLAYOUT, NULL, TRUE );
- }
- else
- {
- LONG errnum=IoErr();
- UBYTE errstring[80];
-
- if (errnum>=DTERROR_UNKNOWN_DATATYPE)
- {
- SPrintf(errstring,GetDTString(errnum),pref->Image);
- }
- else
- {
- Fault(errnum,NULL,errstring,sizeof(errstring));
- }
- Message("%s: %s",NULL,pref->Image,errstring);
- }
-
- if (!(InitOrUpdateGraphics(glob,pref)))
- {
- Message("Failed to update graphics!",NULL);
- }
-
- if (glob->PaintBitMap)
- {
- BltBitMapRastPort(glob->PaintBitMap, 0, 0, glob->Window->RPort, 0, 0, glob->ww, glob->wh, 0xc0);
- }
- else EraseRect(glob->Window->RPort, 0, 0, (glob->ww)-1, (glob->wh)-1);
-
- ClearPointer(glob->Window);
- }
-
-
-
- /*-------------------------------------------*/
- /* Datatypes hook function for ASL requester */
- /*-------------------------------------------*/
-
- ULONG __asm __saveds Filter (register __a0 struct Hook *h, register __a2 struct FileRequester *fr, register __a1 struct AnchorPath *ap)
- {
- struct DataType *dtn;
- ULONG use = FALSE;
- UBYTE buffer[300];
- BPTR lock;
-
- if (ap->ap_Info.fib_DirEntryType > 0)
- {
- use = TRUE;
- }
- else
- {
- strncpy (buffer, fr->fr_Drawer, sizeof (buffer));
- AddPart (buffer, ap->ap_Info.fib_FileName, sizeof (buffer));
- if (lock = Lock (buffer, ACCESS_READ))
- {
- if (dtn = ObtainDataTypeA (DTST_FILE, (APTR) lock, NULL))
- {
- if (dtn->dtn_Header->dth_GroupID == GID_PICTURE)
- use = TRUE;
-
- ReleaseDataType (dtn);
- }
- UnLock (lock);
- }
- }
- return (use);
- }
-
-
-
- /*--------------------------------------*/
- /* Select image to load (ASL requester) */
- /*--------------------------------------*/
-
- BOOL SelectImage(struct Globals *glob, struct FileRequester **fr, UBYTE *filebuffer, ULONG MaxSize)
- {
- BOOL Selected=FALSE;
-
- UBYTE initialdrawer[200];
- UBYTE initialfile [40];
-
- struct Hook filter = {NULL, NULL, NULL, NULL, NULL};
- UBYTE save, *ptr;
-
- filter.h_Entry = (HOOKFUNC)Filter;
-
- ptr = PathPart(filebuffer);
- save = *ptr; *ptr = 0;
- strncpy (initialdrawer,filebuffer,sizeof(initialdrawer));
- initialdrawer[sizeof(initialdrawer)-1]=0;
- *ptr = save;
- strncpy (initialfile, FilePart(filebuffer), sizeof(initialfile));
- initialfile[sizeof(initialfile)-1]=0;
-
- if (!(*fr))
- {
- if(!((*fr) = AllocAslRequestTags (ASL_FileRequest,
- ASLFR_TitleText, "Select Picture to load",
- ASLFR_PositiveText, "Load",
- ASLFR_RejectIcons, TRUE,
- ASLFR_DoPatterns, TRUE,
- TAG_DONE)))
- {
- Message("Couldn't allocate asl requester",NULL);
- }
- }
-
- if (*fr)
- {
- Selected = AslRequestTags(*fr,
- ASLFR_Screen, GetScreen(glob),
- ASLFR_InitialDrawer, initialdrawer,
- ASLFR_InitialFile, initialfile,
- ASLFR_FilterFunc, &filter,
- TAG_DONE);
-
- if (Selected)
- {
- strncpy (filebuffer, (*fr)->fr_Drawer, MaxSize);
- AddPart (filebuffer, (*fr)->fr_File, MaxSize);
- }
- }
-
- return(Selected);
- }
-
-
-
- /*--------------------------------------*/
- /* MIDI hook function for ASL requester */
- /*--------------------------------------*/
-
- ULONG __asm __saveds MIDIFilter (register __a0 struct Hook *h, register __a2 struct FileRequester *fr, register __a1 struct AnchorPath *ap)
- {
- ULONG use = FALSE;
-
- UBYTE buffer[300];
- UBYTE header[20];
- BPTR file;
- int l = 0;
-
- if (ap->ap_Info.fib_DirEntryType >0)
- use = TRUE;
- else
- {
- strncpy (buffer, fr->fr_Drawer, sizeof (buffer));
- AddPart (buffer, ap->ap_Info.fib_FileName, sizeof (buffer));
-
- if (file = Open (buffer, MODE_OLDFILE))
- {
- l=Read(file,header,sizeof(header));
- Close (file);
- }
-
- if (l==sizeof(header))
- {
- if ( ((header[0] == 'M') &&
- (header[1] == 'T') &&
- (header[2] == 'h') &&
- (header[3] == 'd'))
-
- ||
-
- ((header[0] == 'X') &&
- (header[1] == 'P') &&
- (header[2] == 'K') &&
- (header[3] == 'F') &&
- (header[16]== 'M') &&
- (header[17]== 'T') &&
- (header[18]== 'h') &&
- (header[19]== 'd')) )
- {
- use = TRUE;
- }
- }
- }
- return(use);
- }
-
-
-
- /*----------------------------*/
- /* Select a MIDI file to load */
- /*----------------------------*/
-
- BOOL SelectMIDI(struct Globals *glob, struct FileRequester **fr, UBYTE *filebuffer, ULONG MaxSize)
- {
- BOOL Selected=FALSE;
-
- UBYTE initialdrawer[200];
- UBYTE initialfile [40];
-
- struct Hook filter = {NULL, NULL, NULL, NULL, NULL};
- UBYTE save, *ptr;
-
- filter.h_Entry = (HOOKFUNC)MIDIFilter;
-
- ptr = PathPart(filebuffer);
- save = *ptr; *ptr = 0;
- strncpy (initialdrawer,filebuffer,sizeof(initialdrawer));
- initialdrawer[sizeof(initialdrawer)-1]=0;
- *ptr = save;
- strncpy (initialfile, FilePart(filebuffer), sizeof(initialfile));
- initialfile[sizeof(initialfile)-1]=0;
-
- if (!(*fr))
- {
- if (!((*fr) = AllocAslRequestTags (ASL_FileRequest,
- ASLFR_TitleText, "Select MIDI file to play",
- ASLFR_PositiveText, "Play",
- ASLFR_RejectIcons, TRUE,
- ASLFR_DoPatterns, TRUE,
- TAG_DONE)))
- {
- Message("Couldn't allocate asl requester",NULL);
- }
- }
-
- if (*fr)
- {
- Selected = AslRequestTags(*fr,
- ASLFR_Screen, GetScreen(glob),
- ASLFR_FilterFunc, &filter,
- ASLFR_InitialDrawer, initialdrawer,
- ASLFR_InitialFile, initialfile,
- TAG_DONE);
-
- if (Selected)
- {
- strncpy (filebuffer, (*fr)->fr_Drawer, MaxSize);
- AddPart (filebuffer, (*fr)->fr_File, MaxSize);
- }
- }
-
- return(Selected);
- }
-
-
- /*-----------------------------------*/
- /* Invoke PlayMF to play a MIDI file */
- /*-----------------------------------*/
-
- void PlayMIDI(struct Globals *glob, struct Prefs *pref)
- {
- UBYTE CommandString[300];
- BPTR lock;
- BPTR out;
- BOOL CloseOut = FALSE;
-
- if (lock = Lock("/PlayMF/PlayMF", SHARED_LOCK ))
- {
- UnLock(lock);
-
- SPrintf(CommandString,"Run >NIL: /PlayMF/PlayMF \42%s\42 LINK=\42%s\42 REPLACE", pref->MIDIFile, pref->Link);
- }
- else
- {
- SPrintf(CommandString,"Run >NIL: PlayMF \42%s\42 LINK=\42%s\42 REPLACE", pref->MIDIFile, pref->Link);
- }
-
- if ((out = Output()) == NULL)
- {
- if (out = Open("NIL:", MODE_OLDFILE)) CloseOut = TRUE;
- }
-
- if (!Execute( CommandString, NULL, out))
- {
- AsyncMessage(glob,LaunchTask, "Unable to launch PlayMF.\nPlease make sure it is located somewhere in your search path.","Damn");
- }
-
- if (CloseOut) Close(out);
- }
-
-
- /*--------------------------*/
- /* Stop PlayMF (if running) */
- /*--------------------------*/
-
- void StopMIDI(struct Globals *glob, struct Prefs *pref)
- {
- APTR lock;
- struct MidiCluster *clust;
- struct MidiLink *ml;
-
- if (lock = LockCAMD(CD_Linkages))
- {
- if (clust = FindCluster(pref->Link))
- {
- for (ml = (struct MidiLink*)clust->mcl_Senders.lh_Head ;
- ml->ml_Node.ln_Succ ;
- ml = (struct MidiLink*)ml->ml_Node.ln_Succ )
- {
- if (!stricmp("PlayMF Player", ml->ml_MidiNode->mi_Node.ln_Name))
- {
- Signal(ml->ml_MidiNode->mi_SigTask, SIGBREAKF_CTRL_C);
- break;
- }
- }
- }
- UnlockCAMD(lock);
- }
- }
-
-
- /*----------------*/
- /* Open Libraries */
- /*----------------*/
-
- BOOL OpenLibs(void)
- {
- BOOL Success=FALSE;
-
- SysBase = *((struct ExecBase**)(0x4));
-
- if (DOSBase=(struct DosLibrary*)OpenLibrary("dos.library",39L))
- {
- if (GfxBase=(struct GfxBase*)OpenLibrary("graphics.library",39L))
- {
- if (LayersBase=OpenLibrary("layers.library",39L))
- {
- if (IntuitionBase=(struct IntuitionBase*)OpenLibrary("intuition.library",39L))
- {
- if (GadToolsBase=OpenLibrary("gadtools.library", 39L))
- {
- if (UtilityBase=OpenLibrary("utility.library",39L))
- {
- if (!(DatatypesBase=OpenLibrary("datatypes.library",39L)))
- {
- Message("This program requires datatypes.library!",NULL);
- }
- else
- {
- if (!(AslBase=OpenLibrary("asl.library",39L)))
- {
- Message("This program requires asl.library!",NULL);
- }
- else
- {
- if (!(WorkbenchBase=OpenLibrary("workbench.library",39L)))
- {
- Message("This program requires workbench.library!",NULL);
- }
- else
- {
- if (!(CamdBase=OpenLibrary("camd.library",0L)))
- {
- Message("This program requires camd.library!",NULL);
- }
- else
- {
- if ( __fpinit() )
- {
- Message("Unable to initialize floating point!",NULL);
- }
- else
- {
- FPBase=TRUE;
-
- Success=TRUE;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- if (!Success) CloseLibs();
-
- return(Success);
- }
-
-
- /*-----------------*/
- /* Close Libraries */
- /*-----------------*/
-
- void CloseLibs(void)
- {
- if (FPBase)
- {
- __fpterm();
- FPBase=FALSE;
- }
-
- if (CamdBase)
- {
- CloseLibrary(CamdBase);
- CamdBase=NULL;
- }
-
- if (WorkbenchBase)
- {
- CloseLibrary(WorkbenchBase);
- WorkbenchBase=NULL;
- }
-
- if (AslBase)
- {
- CloseLibrary(AslBase);
- AslBase=NULL;
- }
-
- if (DatatypesBase)
- {
- CloseLibrary(DatatypesBase);
- DatatypesBase=NULL;
- }
-
- if (UtilityBase)
- {
- CloseLibrary(UtilityBase);
- UtilityBase=NULL;
- }
-
- if (GadToolsBase)
- {
- CloseLibrary(GadToolsBase);
- GadToolsBase=NULL;
- }
-
- if (IntuitionBase)
- {
- CloseLibrary((struct Library*)IntuitionBase);
- IntuitionBase=NULL;
- }
-
- if (LayersBase)
- {
- CloseLibrary((struct Library*)LayersBase);
- LayersBase=NULL;
- }
-
- if (GfxBase)
- {
- CloseLibrary((struct Library*)GfxBase);
- GfxBase=NULL;
- }
-
- if (DOSBase)
- {
- CloseLibrary((struct Library*)DOSBase);
- DOSBase=NULL;
- }
- }
-
-
- /*-------------------*/
- /* Open timer device */
- /*-------------------*/
-
- struct timerequest *OpenTimer(void)
- {
- BOOL Success = FALSE;
-
- struct MsgPort *reply = NULL;
- struct timerequest *treq = NULL;
-
- if (!(reply = CreateMsgPort()))
- {
- Message("Unable to create timer port!",NULL);
- }
- else
- {
- if (!(treq = CreateIORequest(reply, sizeof(struct timerequest))))
- {
- Message("Unable to create timer request!",NULL);
- }
- else
- {
- if (OpenDevice(TIMERNAME,UNIT_VBLANK,(struct IORequest*)treq,0))
- {
- Message("Timer: Cannot open timer.device (UNIT_VBLANK).",NULL);
- }
- else
- {
- TimerBase = (struct Library*)treq->tr_node.io_Device;
- Success = TRUE;
- }
- }
- }
-
- if (!Success)
- {
- if (TimerBase)
- {
- CloseDevice((struct IORequest*)treq);
- TimerBase = NULL;
- }
-
- if (treq)
- {
- DeleteIORequest(treq);
- treq = NULL;
- }
-
- if (reply)
- {
- DeleteMsgPort(reply);
- reply = NULL;
- }
- }
-
- return(treq);
- }
-
-
-
- /*--------------------*/
- /* Close timer device */
- /*--------------------*/
-
- void CloseTimer(struct timerequest *treq)
- {
- struct MsgPort *reply = NULL;
-
- if (treq)
- {
- if (treq->tr_node.io_Device)
- {
- CloseDevice((struct IORequest*)treq);
- TimerBase = NULL;
- }
-
- reply = treq->tr_node.io_Message.mn_ReplyPort;
-
- DeleteIORequest(treq);
- treq = NULL;
- }
-
- if (reply)
- {
- DeleteMsgPort(reply);
- reply = NULL;
- }
- }
-
-
- /*----------------*/
- /* Get Time Delta */
- /*----------------*/
-
- /* This function returns the time difference in milliseconds */
- /* to the time it was called last */
-
- struct EClockVal eclock;
-
- ULONG GetTimeDelta(void)
- {
- // ULONG old_hi = eclock.ev_hi;
- ULONG old_lo = eclock.ev_lo;
- ULONG E_Freq = ReadEClock(&eclock);
-
- ULONG delta = 1000 * (eclock.ev_lo - old_lo) / E_Freq;
-
- return(delta);
- }
-
-
-
- /*****************************************************************************/
-
- /*------------------------------------------*/
- /* Keep track of the number of Asynch tasks */
- /*------------------------------------------*/
-
- BOOL AllocAsync(struct Globals *glob, TaskFlag flg)
- {
- BOOL success = FALSE;
-
- Forbid();
- if (!(glob->TaskAlloc & flg))
- {
- glob->TaskAlloc |= flg;
- success = TRUE;
- }
- Permit();
-
- if (!success) if (IntuitionBase) DisplayBeep(NULL);
-
- return(success);
- }
-
- void FreeAsync(struct Globals *glob, TaskFlag flg)
- {
- Forbid();
- if (glob->TaskAlloc & flg)
- {
- glob->TaskAlloc &= (~flg);
- }
- Permit();
-
- if (!glob->TaskAlloc) Signal(MyTask, SIGBREAKF_CTRL_F);
- }
-
- BOOL AskAsync(struct Globals *glob)
- {
- BOOL result = FALSE;
-
- if (!glob->TaskAlloc) result = TRUE;
-
- return(result);
- }
-
- void WaitAsync(struct Globals *glob)
- {
- while (glob->TaskAlloc)
- {
- Wait(SIGBREAKF_CTRL_F);
- }
- }
-
-
-
- /*----------------------------*/
- /* Show a message to the user */
- /*----------------------------*/
-
- LONG __stdargs Message(UBYTE *Msg,UBYTE *Options,...)
- {
- LONG retval;
-
- va_list Args;
- va_start(Args,Options);
-
- retval = MessageA(Msg, Options, Args);
-
- va_end(Args);
-
- return(retval);
- }
-
- LONG MessageA(UBYTE *Msg,UBYTE *Options,APTR Args)
- {
- LONG retval;
-
- BOOL req = FALSE;
-
-
- // if (Options) if (strchr(Options,'|')) req = TRUE;
- if (Options) req = TRUE;
-
- if (IntuitionBase && (WBMode || req))
- {
- struct EasyStruct Req={sizeof(struct EasyStruct),0,"Fireworks",0, NULL};
-
- if (!Options) Options = "I see";
-
- Req.es_TextFormat=Msg;
- Req.es_GadgetFormat=Options;
-
- retval=EasyRequestArgs(((struct Process*)MyTask)->pr_WindowPtr,&Req,0,Args);
- }
- else
- {
- if (DOSBase)
- {
- VPrintf(Msg,Args);
- Printf("\n");
-
- retval=0;
- }
- }
- return(retval);
- }
-
-
- /*------------------------------------------*/
- /* Show non-blocking (asynchronous) message */
- /*------------------------------------------*/
-
- struct MsgData
- {
- struct Message Message;
- struct Globals *glob;
- TaskFlag flg;
- UBYTE *Msg;
- UBYTE *Options;
- APTR Args;
- };
-
- void __saveds AsyncMessageTask(void)
- {
- struct MsgData *md;
- struct Process *MyProc = (struct Process*)FindTask(NULL);
- struct Globals *glob;
- TaskFlag flg;
-
- WaitPort(&MyProc->pr_MsgPort);
- if (md = (struct MsgData*)GetMsg(&MyProc->pr_MsgPort))
- {
- glob = md->glob;
- flg = md->flg;
-
- MessageA(md->Msg, md->Options, md->Args);
-
- FreeVec(md);
-
- Forbid();
- FreeAsync(glob, flg);
- }
- }
-
- LONG __stdargs AsyncMessage(struct Globals *glob, TaskFlag flg, UBYTE *Msg,UBYTE *Options,...)
- {
- BOOL Success = FALSE;
- BOOL req = FALSE;
- struct Process *proc;
- struct MsgData *md;
-
- va_list Args;
- va_start(Args,Options);
-
- // if (Options) if (strchr(Options,'|')) req = TRUE;
- if (Options) req = TRUE;
-
- if (IntuitionBase && (WBMode || req))
- {
- if (AllocAsync(glob, flg))
- {
- if (md = AllocVec(sizeof(struct MsgData), MEMF_ANY|MEMF_CLEAR))
- {
- if (proc = CreateNewProcTags(
- NP_Entry, &AsyncMessageTask,
- NP_Name, "Fireworks messaging task",
- NP_Priority, 0,
- NP_Input, Input(),
- NP_Output, Output(),
- NP_CloseInput, FALSE,
- NP_CloseOutput, FALSE,
- TAG_DONE))
- {
- md->Message.mn_ReplyPort = NULL;
- md->Message.mn_Length = sizeof(struct MsgData);
-
- md->glob = glob;
- md->flg = flg;
- md->Msg = Msg;
- md->Options= Options;
- md->Args = Args;
-
- PutMsg(&proc->pr_MsgPort, (struct Message*)md);
-
- Success = TRUE;
- }
- if (!Success) FreeVec(md);
- }
- if (!Success) FreeAsync(glob, flg);
- } else Success = TRUE;
- }
-
- if (!Success)
- {
- MessageA(Msg,Options,Args);
- }
-
- va_end(Args);
-
- return(0);
- }
-
-
- /*-----------------------*/
- /* Standard Exit routine */
- /*-----------------------*/
-
- void __stdargs _XCEXIT(LONG lcode)
- {
- Message("Task wants to exit, return code %ld\nHolding task!", NULL, lcode);
- Wait(0);
- }
-
-
- /*-------------------*/
- /* CAM Library stubs */
- /*-------------------*/
-
- struct MidiNode *CreateMidi(Tag tag, ...)
- {
- return CreateMidiA((struct TagItem *)&tag );
- }
-
- BOOL SetMidiAttrs(struct MidiNode *mi, Tag tag, ...)
- {
- return SetMidiAttrsA(mi, (struct TagItem *)&tag );
- }
-
- struct MidiLink *AddMidiLink(struct MidiNode *mi, LONG type, Tag tag, ...)
- {
- return AddMidiLinkA(mi, type, (struct TagItem *)&tag );
- }
-
- BOOL SetMidiLinkAttrs(struct MidiLink *mi, Tag tag, ...)
- {
- return SetMidiLinkAttrsA(mi, (struct TagItem *)&tag );
- }
-